AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Player Class Reference

#include "Player.h"

Inheritance diagram for Player:
Unit GridObject< Player > WorldObject Object WorldLocation Position

Classes

struct  BgBattlegroundQueueID_Rec
 
struct  ChatFloodThrottle
 

Public Types

typedef std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
 
typedef std::set< uint32DFQuestsDoneList
 
- Public Types inherited from Unit
typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 Player (WorldSession *session)
 
 ~Player () override
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void SetObjectScale (float scale) override
 
bool hasSpanishClient ()
 
bool TeleportTo (uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
 
bool TeleportTo (WorldLocation const &loc, uint32 options=0, Unit *target=nullptr)
 
bool TeleportToEntryPoint ()
 
void SetSummonPoint (uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
 
bool IsSummonAsSpectator () const
 
void SetSummonAsSpectator (bool on)
 
void SummonIfPossible (bool agree, ObjectGuid summoner_guid)
 
time_t GetSummonExpireTimer () const
 
bool Create (ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
 
void Update (uint32 time) override
 
PlayerFlags GetPlayerFlags () const
 
bool HasPlayerFlag (PlayerFlags flags) const
 
void SetPlayerFlag (PlayerFlags flags)
 
void RemovePlayerFlag (PlayerFlags flags)
 
void ReplaceAllPlayerFlags (PlayerFlags flags)
 
bool IsClass (Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
 
void SetInWater (bool apply)
 
bool IsInWater () const override
 
bool IsFalling () const
 
bool IsInAreaTriggerRadius (AreaTrigger const *trigger, float delta=0.f) const
 
void SendInitialPacketsBeforeAddToMap ()
 
void SendInitialPacketsAfterAddToMap ()
 
void SendTransferAborted (uint32 mapid, TransferAbortReason reason, uint8 arg=0)
 
void SendInstanceResetWarning (uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
 
bool CanInteractWithQuestGiver (Object *questGiver)
 
CreatureGetNPCIfCanInteractWith (ObjectGuid guid, uint32 npcflagmask)
 
GameObjectGetGameObjectIfCanInteractWith (ObjectGuid guid, GameobjectTypes type) const
 
void ToggleAFK ()
 
void ToggleDND ()
 
bool isAFK () const
 
bool isDND () const
 
uint8 GetChatTag () const
 
uint32 GetBarberShopCost (uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
 
PlayerSocialGetSocial ()
 
void InitTaxiNodesForLevel ()
 
bool ActivateTaxiPathTo (std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
 
bool ActivateTaxiPathTo (uint32 taxi_path_id, uint32 spellid=1)
 
void CleanupAfterTaxiFlight ()
 
void ContinueTaxiFlight ()
 
void SendTaxiNodeStatusMultiple ()
 
bool IsCommentator () const
 
void SetCommentator (bool on)
 
bool IsDeveloper () const
 
void SetDeveloper (bool on)
 
bool isAcceptWhispers () const
 
void SetAcceptWhispers (bool on)
 
bool IsGameMaster () const
 
void SetGameMaster (bool on)
 
bool isGMChat () const
 
void SetGMChat (bool on)
 
bool isTaxiCheater () const
 
void SetTaxiCheater (bool on)
 
bool isGMVisible () const
 
void SetGMVisible (bool on)
 
bool Has310Flyer (bool checkAllSpells, uint32 excludeSpellId=0)
 
void SetHas310Flyer (bool on)
 
void SetPvPDeath (bool on)
 
void GiveXP (uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
 
void GiveLevel (uint8 level)
 
void InitStatsForLevel (bool reapplyMods=false)
 
bool HasActivePowerType (Powers power) override
 
bool GetCommandStatus (uint32 command) const
 
void SetCommandStatusOn (uint32 command)
 
void SetCommandStatusOff (uint32 command)
 
uint32 GetTotalPlayedTime ()
 
uint32 GetLevelPlayedTime ()
 
void setDeathState (DeathState s, bool despawn=false) override
 
void SetRestState (uint32 triggerId)
 
void RemoveRestState ()
 
uint32 GetXPRestBonus (uint32 xp)
 
float GetRestBonus () const
 
void SetRestBonus (float rest_bonus_new)
 
bool HasRestFlag (RestFlag restFlag) const
 
void SetRestFlag (RestFlag restFlag, uint32 triggerId=0)
 
void RemoveRestFlag (RestFlag restFlag)
 
uint32 GetInnTriggerId () const
 
PetStableGetPetStable ()
 
PetStableGetOrInitPetStable ()
 
PetStable const * GetPetStable () const
 
PetGetPet () const
 
PetSummonPet (uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0s, uint32 healthPct=0)
 
void RemovePet (Pet *pet, PetSaveMode mode, bool returnreagent=false)
 
bool CanPetResurrect ()
 
bool IsExistPet ()
 
PetCreatePet (Creature *creatureTarget, uint32 spellID=0)
 
PetCreatePet (uint32 creatureEntry, uint32 spellID=0)
 
uint32 GetPhaseMaskForSpawn () const
 
void Say (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles said message in regular chat based on declared language and in config pre-defined Range. More...
 
void Say (uint32 textId, WorldObject const *target=nullptr) override
 
void Yell (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles yelled message in regular chat based on declared language and in config pre-defined Range. More...
 
void Yell (uint32 textId, WorldObject const *target=nullptr) override
 
void TextEmote (std::string_view text, WorldObject const *=nullptr, bool=false) override
 Outputs an universal text which is supposed to be an action. More...
 
void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false) override
 
void Whisper (std::string_view text, Language language, Player *receiver, bool=false) override
 Handles whispers from Addons and players based on sender, receiver's guid and language. More...
 
void Whisper (uint32 textId, Player *target, bool isBossWhisper=false) override
 
void SetVirtualItemSlot (uint8 i, Item *item)
 
void SetSheath (SheathState sheathed) override
 
uint8 FindEquipSlot (ItemTemplate const *proto, uint32 slot, bool swap) const
 
uint32 GetItemCount (uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
 
uint32 GetItemCountWithLimitCategory (uint32 limitCategory, Item *skipItem=nullptr) const
 
ItemGetItemByGuid (ObjectGuid guid) const
 
ItemGetItemByEntry (uint32 entry) const
 
ItemGetItemByPos (uint16 pos) const
 
ItemGetItemByPos (uint8 bag, uint8 slot) const
 
BagGetBagByPos (uint8 slot) const
 
uint32 GetFreeInventorySpace () const
 
ItemGetUseableItemByPos (uint8 bag, uint8 slot) const
 
ItemGetWeaponForAttack (WeaponAttackType attackType, bool useable=false) const
 
ItemGetShield (bool useable=false) const
 
std::vector< Item * > & GetItemUpdateQueue ()
 
bool IsValidPos (uint16 pos, bool explicit_pos)
 
bool IsValidPos (uint8 bag, uint8 slot, bool explicit_pos)
 
uint8 GetBankBagSlotCount () const
 
void SetBankBagSlotCount (uint8 count)
 
bool HasItemCount (uint32 item, uint32 count=1, bool inBankAlso=false) const
 
bool HasItemFitToSpellRequirements (SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
 
bool CanNoReagentCast (SpellInfo const *spellInfo) const
 
bool HasItemOrGemWithIdEquipped (uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
 
bool HasItemOrGemWithLimitCategoryEquipped (uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
 
InventoryResult CanTakeMoreSimilarItems (Item *pItem) const
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count) const
 
InventoryResult CanStoreNewItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
 
InventoryResult CanStoreItems (Item **pItem, int32 count) const
 
InventoryResult CanEquipNewItem (uint8 slot, uint16 &dest, uint32 item, bool swap) const
 
InventoryResult CanEquipItem (uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanEquipUniqueItem (Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanEquipUniqueItem (ItemTemplate const *itemProto, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanUnequipItems (uint32 item, uint32 count) const
 
InventoryResult CanUnequipItem (uint16 src, bool swap) const
 
InventoryResult CanBankItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanUseItem (Item *pItem, bool not_loading=true) const
 
bool HasItemTotemCategory (uint32 TotemCategory) const
 
bool IsTotemCategoryCompatiableWith (ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
 
InventoryResult CanUseItem (ItemTemplate const *pItem) const
 
InventoryResult CanUseAmmo (uint32 item) const
 
InventoryResult CanRollForItemInLFG (ItemTemplate const *item, WorldObject const *lootedObject) const
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet &allowedLooters)
 
ItemStoreItem (ItemPosCountVec const &pos, Item *pItem, bool update)
 
ItemEquipNewItem (uint16 pos, uint32 item, bool update)
 
ItemEquipItem (uint16 pos, Item *pItem, bool update)
 
void AutoUnequipOffhandIfNeed (bool force=false)
 
bool StoreNewItemInBestSlots (uint32 item_id, uint32 item_count)
 
void AutoStoreLoot (uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
 
void AutoStoreLoot (uint32 loot_id, LootStore const &store, bool broadcast=false)
 
LootItemStoreLootItem (uint8 lootSlot, Loot *loot, InventoryResult &msg)
 
void UpdateLootAchievements (LootItem *item, Loot *loot)
 
void UpdateTitansGrip ()
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count, Item *pItem, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 entry, uint32 count, Item *pItem=nullptr, bool swap=false, uint32 *no_space_count=nullptr) const
 
void AddRefundReference (ObjectGuid itemGUID)
 
void DeleteRefundReference (ObjectGuid itemGUID)
 
void ApplyEquipCooldown (Item *pItem)
 
void SetAmmo (uint32 item)
 
void RemoveAmmo ()
 
float GetAmmoDPS () const
 
bool CheckAmmoCompatibility (ItemTemplate const *ammo_proto) const
 
void QuickEquipItem (uint16 pos, Item *pItem)
 
void VisualizeItem (uint8 slot, Item *pItem)
 
void SetVisibleItemSlot (uint8 slot, Item *pItem)
 
ItemBankItem (ItemPosCountVec const &dest, Item *pItem, bool update)
 
ItemBankItem (uint16 pos, Item *pItem, bool update)
 
void RemoveItem (uint8 bag, uint8 slot, bool update, bool swap=false)
 
void MoveItemFromInventory (uint8 bag, uint8 slot, bool update)
 
void MoveItemToInventory (ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
 
void RemoveItemDependentAurasAndCasts (Item *pItem)
 
void DestroyItem (uint8 bag, uint8 slot, bool update)
 
void DestroyItemCount (uint32 item, uint32 count, bool update, bool unequip_check=false)
 
void DestroyItemCount (Item *item, uint32 &count, bool update)
 
void DestroyConjuredItems (bool update)
 
void DestroyZoneLimitedItem (bool update, uint32 new_zone)
 
void SplitItem (uint16 src, uint16 dst, uint32 count)
 
void SwapItem (uint16 src, uint16 dst)
 
void AddItemToBuyBackSlot (Item *pItem, uint32 money)
 
ItemGetItemFromBuyBackSlot (uint32 slot)
 
void RemoveItemFromBuyBackSlot (uint32 slot, bool del)
 
uint32 GetMaxKeyringSize () const
 
void SendEquipError (InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
 
void SendBuyError (BuyResult msg, Creature *creature, uint32 item, uint32 param)
 
void SendSellError (SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
 
void AddWeaponProficiency (uint32 newflag)
 
void AddArmorProficiency (uint32 newflag)
 
uint32 GetWeaponProficiency () const
 
uint32 GetArmorProficiency () const
 
bool IsTwoHandUsed () const
 
void SendNewItem (Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
 
bool BuyItemFromVendorSlot (ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
 
bool _StoreOrEquipNewItem (uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
 
float GetReputationPriceDiscount (Creature const *creature) const
 
float GetReputationPriceDiscount (FactionTemplateEntry const *factionTemplate) const
 
PlayerGetTrader () const
 
TradeDataGetTradeData () const
 
void TradeCancel (bool sendback)
 
CinematicMgrGetCinematicMgr () const
 
void UpdateEnchantTime (uint32 time)
 
void UpdateSoulboundTradeItems ()
 
void AddTradeableItem (Item *item)
 
void RemoveTradeableItem (Item *item)
 
void UpdateItemDuration (uint32 time, bool realtimeonly=false)
 
void AddEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurationsReferences (Item *item)
 
void RemoveArenaEnchantments (EnchantmentSlot slot)
 
void AddEnchantmentDuration (Item *item, EnchantmentSlot slot, uint32 duration)
 
void ApplyEnchantment (Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
 
void ApplyEnchantment (Item *item, bool apply)
 
void UpdateSkillEnchantments (uint16 skill_id, uint16 curr_value, uint16 new_value)
 
void SendEnchantmentDurations ()
 
void UpdateEnchantmentDurations ()
 
void BuildEnchantmentsInfoData (WorldPacket *data)
 
void AddItemDurations (Item *item)
 
void RemoveItemDurations (Item *item)
 
void SendItemDurations ()
 
void LoadCorpse (PreparedQueryResult result)
 
void LoadPet ()
 
bool AddItem (uint32 itemId, uint32 count)
 
void PrepareGossipMenu (WorldObject *source, uint32 menuId=0, bool showQuests=false)
 
void SendPreparedGossip (WorldObject *source)
 
void OnGossipSelect (WorldObject *source, uint32 gossipListId, uint32 menuId)
 
uint32 GetGossipTextId (uint32 menuId, WorldObject *source)
 
uint32 GetGossipTextId (WorldObject *source)
 
void ToggleInstantFlight ()
 
int32 GetQuestLevel (Quest const *quest) const
 
void PrepareQuestMenu (ObjectGuid guid)
 
void SendPreparedQuest (ObjectGuid guid)
 
bool IsActiveQuest (uint32 quest_id) const
 
Quest const * GetNextQuest (ObjectGuid guid, Quest const *quest)
 
bool CanSeeStartQuest (Quest const *quest)
 
bool CanTakeQuest (Quest const *quest, bool msg)
 
bool CanAddQuest (Quest const *quest, bool msg)
 
bool CanCompleteQuest (uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
 
bool CanCompleteRepeatableQuest (Quest const *quest)
 
bool CanRewardQuest (Quest const *quest, bool msg)
 
bool CanRewardQuest (Quest const *quest, uint32 reward, bool msg)
 
void AddQuestAndCheckCompletion (Quest const *quest, Object *questGiver)
 
void AddQuest (Quest const *quest, Object *questGiver)
 
void AbandonQuest (uint32 quest_id)
 
void CompleteQuest (uint32 quest_id)
 
void IncompleteQuest (uint32 quest_id)
 
void RewardQuest (Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
 
void FailQuest (uint32 quest_id)
 
bool SatisfyQuestSkill (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLevel (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLog (bool msg)
 
bool SatisfyQuestPreviousQuest (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestClass (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestRace (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestReputation (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestStatus (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestConditions (Quest const *qInfo, bool msg)
 
bool SatisfyQuestTimed (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestExclusiveGroup (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestNextChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestPrevChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestDay (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestWeek (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestMonth (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestSeasonal (Quest const *qInfo, bool msg) const
 
bool GiveQuestSourceItem (Quest const *quest)
 
bool TakeQuestSourceItem (uint32 questId, bool msg)
 
uint32 CalculateQuestRewardXP (Quest const *quest)
 
bool GetQuestRewardStatus (uint32 quest_id) const
 
QuestStatus GetQuestStatus (uint32 quest_id) const
 
void SetQuestStatus (uint32 questId, QuestStatus status, bool update=true)
 
void RemoveActiveQuest (uint32 questId, bool update=true)
 
void RemoveRewardedQuest (uint32 questId, bool update=true)
 
void SendQuestUpdate (uint32 questId)
 
QuestGiverStatus GetQuestDialogStatus (Object *questGiver)
 
float GetQuestRate (bool isDFQuest=false)
 
void SetDailyQuestStatus (uint32 quest_id)
 
bool IsDailyQuestDone (uint32 quest_id)
 
void SetWeeklyQuestStatus (uint32 quest_id)
 
void SetMonthlyQuestStatus (uint32 quest_id)
 
void SetSeasonalQuestStatus (uint32 quest_id)
 
void ResetDailyQuestStatus ()
 
void ResetWeeklyQuestStatus ()
 
void ResetMonthlyQuestStatus ()
 
void ResetSeasonalQuestStatus (uint16 event_id)
 
uint16 FindQuestSlot (uint32 quest_id) const
 
uint32 GetQuestSlotQuestId (uint16 slot) const
 
uint32 GetQuestSlotState (uint16 slot) const
 
uint16 GetQuestSlotCounter (uint16 slot, uint8 counter) const
 
uint32 GetQuestSlotTime (uint16 slot) const
 
void SetQuestSlot (uint16 slot, uint32 quest_id, uint32 timer=0)
 
void SetQuestSlotCounter (uint16 slot, uint8 counter, uint16 count)
 
void SetQuestSlotState (uint16 slot, uint32 state)
 
void RemoveQuestSlotState (uint16 slot, uint32 state)
 
void SetQuestSlotTimer (uint16 slot, uint32 timer)
 
void SwapQuestSlot (uint16 slot1, uint16 slot2)
 
uint16 GetReqKillOrCastCurrentCount (uint32 quest_id, int32 entry)
 
void AreaExploredOrEventHappens (uint32 questId)
 
void GroupEventHappens (uint32 questId, WorldObject const *pEventObject)
 
void ItemAddedQuestCheck (uint32 entry, uint32 count)
 
void ItemRemovedQuestCheck (uint32 entry, uint32 count)
 
void KilledMonster (CreatureTemplate const *cInfo, ObjectGuid guid)
 
void KilledMonsterCredit (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void KilledPlayerCredit (uint16 count=1)
 
void KilledPlayerCreditForQuest (uint16 count, Quest const *quest)
 
void KillCreditGO (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void TalkedToCreature (uint32 entry, ObjectGuid guid)
 
void MoneyChanged (uint32 value)
 
void ReputationChanged (FactionEntry const *factionEntry)
 
void ReputationChanged2 (FactionEntry const *factionEntry)
 
bool HasQuestForItem (uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
 
bool HasQuestForGO (int32 GOId) const
 
bool HasQuest (uint32 questId) const
 
void UpdateForQuestWorldObjects ()
 
bool CanShareQuest (uint32 quest_id) const
 
void SendQuestComplete (uint32 quest_id)
 
void SendQuestReward (Quest const *quest, uint32 XP)
 
void SendQuestFailed (uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
 
void SendQuestTimerFailed (uint32 quest_id)
 
void SendCanTakeQuestResponse (uint32 msg) const
 
void SendQuestConfirmAccept (Quest const *quest, Player *pReceiver)
 
void SendPushToPartyResponse (Player const *player, uint8 msg) const
 
void SendQuestUpdateAddItem (Quest const *quest, uint32 item_idx, uint16 count)
 
void SendQuestUpdateAddCreatureOrGo (Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
 
void SendQuestUpdateAddPlayer (Quest const *quest, uint16 old_count, uint16 add_count)
 
ObjectGuid GetDivider ()
 
void SetDivider (ObjectGuid guid=ObjectGuid::Empty)
 
uint32 GetInGameTime ()
 
void SetInGameTime (uint32 time)
 
void AddTimedQuest (uint32 quest_id)
 
void RemoveTimedQuest (uint32 quest_id)
 
bool HasPvPForcingQuest () const
 
bool LoadFromDB (ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
 
bool isBeingLoaded () const override
 
void Initialize (ObjectGuid::LowType guid)
 
void SaveToDB (bool create, bool logout)
 
void SaveToDB (CharacterDatabaseTransaction trans, bool create, bool logout)
 
void SaveInventoryAndGoldToDB (CharacterDatabaseTransaction trans)
 
void SaveGoldToDB (CharacterDatabaseTransaction trans)
 
void _SaveSkills (CharacterDatabaseTransaction trans)
 
void SetBindPoint (ObjectGuid guid)
 
void SendTalentWipeConfirm (ObjectGuid guid)
 
void ResetPetTalents ()
 
void CalcRage (uint32 damage, bool attacker)
 
void RegenerateAll ()
 
void Regenerate (Powers power)
 
void RegenerateHealth ()
 
void setRegenTimerCount (uint32 time)
 
void setWeaponChangeTimer (uint32 time)
 
uint32 GetMoney () const
 
bool ModifyMoney (int32 amount, bool sendError=true)
 
bool HasEnoughMoney (uint32 amount) const
 
bool HasEnoughMoney (int32 amount) const
 
void SetMoney (uint32 value)
 
RewardedQuestSet const & getRewardedQuests () const
 
QuestStatusMapgetQuestStatusMap ()
 
QuestStatusSaveMapGetQuestStatusSaveMap ()
 
std::size_t GetRewardedQuestCount () const
 
bool IsQuestRewarded (uint32 quest_id) const
 
UnitGetSelectedUnit () const
 
PlayerGetSelectedPlayer () const
 
void SetTarget (ObjectGuid=ObjectGuid::Empty) override
 
void SetSelection (ObjectGuid guid)
 Used for serverside target changes, does not apply to players. More...
 
void SendMailResult (uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
 
void SendNewMail ()
 
void UpdateNextMailTimeAndUnreads ()
 
void AddNewMailDeliverTime (time_t deliver_time)
 
void RemoveMail (uint32 id)
 
void AddMail (Mail *mail)
 
uint32 GetMailSize ()
 
MailGetMail (uint32 id)
 
PlayerMails const & GetMails () const
 
void SendItemRetrievalMail (uint32 itemEntry, uint32 count)
 
void SendItemRetrievalMail (std::vector< std::pair< uint32, uint32 > > mailItems)
 
ItemGetMItem (ObjectGuid::LowType itemLowGuid)
 
void AddMItem (Item *it)
 
bool RemoveMItem (ObjectGuid::LowType itemLowGuid)
 
void PetSpellInitialize ()
 
void CharmSpellInitialize ()
 
void PossessSpellInitialize ()
 
void VehicleSpellInitialize ()
 
void SendRemoveControlBar ()
 
bool HasSpell (uint32 spell) const override
 
bool HasActiveSpell (uint32 spell) const
 
TrainerSpellState GetTrainerSpellState (TrainerSpell const *trainer_spell) const
 
bool IsSpellFitByClassAndRace (uint32 spell_id) const
 
bool IsNeedCastPassiveSpellAtLearn (SpellInfo const *spellInfo) const
 
void SendProficiency (ItemClass itemClass, uint32 itemSubclassMask)
 
void SendInitialSpells ()
 
void SendLearnPacket (uint32 spellId, bool learn)
 
bool addSpell (uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
 
bool _addSpell (uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
 
void learnSpell (uint32 spellId, bool temporary=false, bool learnFromSkill=false)
 
void removeSpell (uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
 
void resetSpells ()
 
void LearnCustomSpells ()
 
void LearnDefaultSkills ()
 
void LearnDefaultSkill (uint32 skillId, uint16 rank)
 
void learnQuestRewardedSpells ()
 
void learnQuestRewardedSpells (Quest const *quest)
 
void learnSpellHighRank (uint32 spellid)
 
void SetReputation (uint32 factionentry, float value)
 
uint32 GetReputation (uint32 factionentry) const
 
std::string const & GetGuildName ()
 
uint32 GetFreeTalentPoints () const
 
void SetFreeTalentPoints (uint32 points)
 
bool resetTalents (bool noResetCost=false)
 
uint32 resetTalentsCost () const
 
bool IsMaxLevel () const
 
void InitTalentForLevel ()
 
void BuildPlayerTalentsInfoData (WorldPacket *data)
 
void BuildPetTalentsInfoData (WorldPacket *data)
 
void SendTalentsInfoData (bool pet)
 
void LearnTalent (uint32 talentId, uint32 talentRank, bool command=false)
 
void LearnPetTalent (ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
 
bool addTalent (uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
 
void _removeTalent (PlayerTalentMap::iterator &itr, uint8 specMask)
 
void _removeTalent (uint32 spellId, uint8 specMask)
 
void _removeTalentAurasAndSpells (uint32 spellId)
 
void _addTalentAurasAndSpells (uint32 spellId)
 
bool HasTalent (uint32 spell_id, uint8 spec) const
 
uint32 CalculateTalentsPoints () const
 
void UpdateSpecCount (uint8 count)
 
uint8 GetActiveSpec () const
 
uint8 GetActiveSpecMask () const
 
void SetActiveSpec (uint8 spec)
 
uint8 GetSpecsCount () const
 
void SetSpecsCount (uint8 count)
 
void ActivateSpec (uint8 spec)
 
void LoadActions (PreparedQueryResult result)
 
void GetTalentTreePoints (uint8(&specPoints)[3]) const
 
uint8 GetMostPointsTalentTree () const
 
bool HasTankSpec ()
 
bool HasMeleeSpec ()
 
bool HasCasterSpec ()
 
bool HasHealSpec ()
 
uint32 GetSpec (int8 spec=-1)
 
void InitGlyphsForLevel ()
 
void SetGlyphSlot (uint8 slot, uint32 slottype)
 
uint32 GetGlyphSlot (uint8 slot) const
 
void SetGlyph (uint8 slot, uint32 glyph, bool save)
 
uint32 GetGlyph (uint8 slot) const
 
uint32 GetFreePrimaryProfessionPoints () const
 
void SetFreePrimaryProfessions (uint16 profs)
 
void InitPrimaryProfessions ()
 
PlayerSpellMap const & GetSpellMap () const
 
PlayerSpellMapGetSpellMap ()
 
SpellCooldowns const & GetSpellCooldownMap () const
 
SpellCooldownsGetSpellCooldownMap ()
 
void AddSpellMod (SpellModifier *mod, bool apply)
 
bool IsAffectedBySpellmod (SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
 
bool HasSpellMod (SpellModifier *mod, Spell *spell)
 
template<class T >
void ApplySpellMod (uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
 
void RemoveSpellMods (Spell *spell)
 
void RestoreSpellMods (Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void RestoreAllSpellMods (uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void DropModCharge (SpellModifier *mod, Spell *spell)
 
void SetSpellModTakingSpell (Spell *spell, bool apply)
 
bool HasSpellCooldown (uint32 spell_id) const override
 
bool HasSpellItemCooldown (uint32 spell_id, uint32 itemid) const override
 
uint32 GetSpellCooldownDelay (uint32 spell_id) const
 
void AddSpellAndCategoryCooldowns (SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
 
void AddSpellCooldown (uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
 
void _AddSpellCooldown (uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void ModifySpellCooldown (uint32 spellId, int32 cooldown)
 
void SendCooldownEvent (SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
 
void ProhibitSpellSchool (SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
 
void RemoveSpellCooldown (uint32 spell_id, bool update=false)
 
void SendClearCooldown (uint32 spell_id, Unit *target)
 
GlobalCooldownMgrGetGlobalCooldownMgr ()
 
void RemoveCategoryCooldown (uint32 cat)
 
void RemoveArenaSpellCooldowns (bool removeActivePetCooldowns=false)
 
void RemoveAllSpellCooldown ()
 
void _LoadSpellCooldowns (PreparedQueryResult result)
 
void _SaveSpellCooldowns (CharacterDatabaseTransaction trans, bool logout)
 
uint32 GetLastPotionId ()
 
void SetLastPotionId (uint32 item_id)
 
void UpdatePotionCooldown (Spell *spell=nullptr)
 
void setResurrectRequestData (ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
 
void clearResurrectRequestData ()
 
bool isResurrectRequestedBy (ObjectGuid guid) const
 
bool isResurrectRequested () const
 
void ResurectUsingRequestData ()
 
uint8 getCinematic () const
 
void setCinematic (uint8 cine)
 
ActionButtonaddActionButton (uint8 button, uint32 action, uint8 type)
 
void removeActionButton (uint8 button)
 
ActionButton const * GetActionButton (uint8 button)
 
void SendInitialActionButtons () const
 
void SendActionButtons (uint32 state) const
 
bool IsActionButtonDataValid (uint8 button, uint32 action, uint8 type)
 
void UpdatePvPState ()
 
void UpdateFFAPvPState (bool reset=true)
 
void SetPvP (bool state)
 
void UpdatePvP (bool state, bool _override=false)
 
void UpdateZone (uint32 newZone, uint32 newArea)
 
void UpdateArea (uint32 newArea)
 
void SetNeedZoneUpdate (bool needUpdate)
 
void UpdateZoneDependentAuras (uint32 zone_id)
 
void UpdateAreaDependentAuras (uint32 area_id)
 
void UpdateAfkReport (time_t currTime)
 checks the 15 afk reports per 5 minutes limit More...
 
void UpdatePvPFlag (time_t currTime)
 
void UpdateFFAPvPFlag (time_t currTime)
 
void UpdateContestedPvP (uint32 currTime)
 
void SetContestedPvPTimer (uint32 newTime)
 
void ResetContestedPvP ()
 
void UpdateDuelFlag (time_t currTime)
 
void CheckDuelDistance (time_t currTime)
 
void DuelComplete (DuelCompleteType type)
 
void SendDuelCountdown (uint32 counter)
 
bool IsGroupVisibleFor (Player const *p) const
 
bool IsInSameGroupWith (Player const *p) const
 
bool IsInSameRaidWith (Player const *p) const
 
void UninviteFromGroup ()
 
void RemoveFromGroup (RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT)
 
void SendUpdateToOutOfRangeGroupMembers ()
 
void SetInGuild (uint32 GuildId)
 
void SetRank (uint8 rankId)
 
uint8 GetRank () const
 
void SetGuildIdInvited (uint32 GuildId)
 
uint32 GetGuildId () const
 
GuildGetGuild () const
 
uint32 GetGuildIdInvited ()
 
void SetInArenaTeam (uint32 ArenaTeamId, uint8 slot, uint8 type)
 
void SetArenaTeamInfoField (uint8 slot, ArenaTeamInfoType type, uint32 value)
 
uint32 GetArenaPersonalRating (uint8 slot) const
 
uint32 GetArenaTeamId (uint8 slot) const
 
void SetArenaTeamIdInvited (uint32 ArenaTeamId)
 
uint32 GetArenaTeamIdInvited ()
 
Difficulty GetDifficulty (bool isRaid) const
 
Difficulty GetDungeonDifficulty () const
 
Difficulty GetRaidDifficulty () const
 
Difficulty GetStoredRaidDifficulty () const
 
void SetDungeonDifficulty (Difficulty dungeon_difficulty)
 
void SetRaidDifficulty (Difficulty raid_difficulty)
 
void StoreRaidMapDifficulty ()
 
bool UpdateSkill (uint32 skill_id, uint32 step)
 
bool UpdateSkillPro (uint16 SkillId, int32 Chance, uint32 step)
 
bool UpdateCraftSkill (uint32 spellid)
 
bool UpdateGatherSkill (uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
 
bool UpdateFishingSkill ()
 
uint32 GetBaseDefenseSkillValue () const
 
uint32 GetBaseWeaponSkillValue (WeaponAttackType attType) const
 
uint32 GetSpellByProto (ItemTemplate *proto)
 
float GetHealthBonusFromStamina ()
 
float GetManaBonusFromIntellect ()
 
bool UpdateStats (Stats stat) override
 
bool UpdateAllStats () override
 
void ApplySpellPenetrationBonus (int32 amount, bool apply)
 
void UpdateResistances (uint32 school) override
 
void UpdateArmor () override
 
void UpdateMaxHealth () override
 
void UpdateMaxPower (Powers power) override
 
void ApplyFeralAPBonus (int32 amount, bool apply)
 
void UpdateAttackPowerAndDamage (bool ranged=false) override
 
void UpdateShieldBlockValue ()
 
void ApplySpellPowerBonus (int32 amount, bool apply)
 
void UpdateSpellDamageAndHealingBonus ()
 
void ApplyRatingMod (CombatRating cr, int32 value, bool apply)
 
void UpdateRating (CombatRating cr)
 
void UpdateAllRatings ()
 
void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
 
void UpdateDefenseBonusesMod ()
 
void RecalculateRating (CombatRating cr)
 
float GetMeleeCritFromAgility ()
 
void GetDodgeFromAgility (float &diminishing, float &nondiminishing)
 
float GetMissPercentageFromDefence () const
 
float GetSpellCritFromIntellect ()
 
float OCTRegenHPPerSpirit ()
 
float OCTRegenMPPerSpirit ()
 
float GetRatingMultiplier (CombatRating cr) const
 
float GetRatingBonusValue (CombatRating cr) const
 
uint32 GetBaseSpellPowerBonus ()
 
int32 GetSpellPenetrationItemMod () const
 
float GetExpertiseDodgeOrParryReduction (WeaponAttackType attType) const
 
void UpdateBlockPercentage ()
 
void UpdateCritPercentage (WeaponAttackType attType)
 
void UpdateAllCritPercentages ()
 
void UpdateParryPercentage ()
 
void UpdateDodgePercentage ()
 
void UpdateMeleeHitChances ()
 
void UpdateRangedHitChances ()
 
void UpdateSpellHitChances ()
 
void UpdateAllSpellCritChances ()
 
void UpdateSpellCritChance (uint32 school)
 
void UpdateArmorPenetration (int32 amount)
 
void UpdateExpertise (WeaponAttackType attType)
 
void ApplyManaRegenBonus (int32 amount, bool apply)
 
void ApplyHealthRegenBonus (int32 amount, bool apply)
 
void UpdateManaRegen ()
 
void UpdateRuneRegen (RuneType rune)
 
ObjectGuid GetLootGUID () const
 
void SetLootGUID (ObjectGuid guid)
 
void RemovedInsignia (Player *looterPlr)
 
WorldSessionGetSession () const
 
void SetSession (WorldSession *sess)
 
void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target) override
 
void DestroyForPlayer (Player *target, bool onDeath=false) const override
 
void SendLogXPGain (uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
 
void SendAttackSwingCantAttack ()
 
void SendAttackSwingCancelAttack ()
 
void SendAttackSwingDeadTarget ()
 
void SendAttackSwingNotInRange ()
 
void SendAttackSwingBadFacingAttack ()
 
void SendAutoRepeatCancel (Unit *target)
 
void SendExplorationExperience (uint32 Area, uint32 Experience)
 
void SendDungeonDifficulty (bool IsInGroup)
 
void SendRaidDifficulty (bool IsInGroup, int32 forcedDifficulty=-1)
 
void SendResetInstanceSuccess (uint32 MapId)
 
void SendResetInstanceFailed (uint32 reason, uint32 MapId)
 
void SendResetFailedNotify (uint32 mapid)
 
bool UpdatePosition (float x, float y, float z, float orientation, bool teleport=false) override
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessTerrainStatusUpdate () override
 
void SendMessageToSet (WorldPacket const *data, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist=false) const
 
void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const override
 
void SendTeleportAckPacket ()
 
CorpseGetCorpse () const
 
void SpawnCorpseBones (bool triggerSave=true)
 
CorpseCreateCorpse ()
 
void RemoveCorpse ()
 
void KillPlayer ()
 
bool HasCorpse () const
 
WorldLocation GetCorpseLocation () const
 
uint32 GetResurrectionSpellId ()
 
void ResurrectPlayer (float restore_percent, bool applySickness=false)
 
void BuildPlayerRepop ()
 
void RepopAtGraveyard ()
 
void SendDurabilityLoss ()
 
void DurabilityLossAll (double percent, bool inventory)
 
void DurabilityLoss (Item *item, double percent)
 
void DurabilityPointsLossAll (int32 points, bool inventory)
 
void DurabilityPointsLoss (Item *item, int32 points)
 
void DurabilityPointLossForEquipSlot (EquipmentSlots slot)
 
uint32 DurabilityRepairAll (bool cost, float discountMod, bool guildBank)
 
uint32 DurabilityRepair (uint16 pos, bool cost, float discountMod, bool guildBank)
 
void UpdateMirrorTimers ()
 
void StopMirrorTimers ()
 
bool IsMirrorTimerActive (MirrorTimerType type)
 
void SetMovement (PlayerMovementType pType)
 
bool CanJoinConstantChannelInZone (ChatChannelsEntry const *channel, AreaTableEntry const *zone)
 
void JoinedChannel (Channel *c)
 
void LeftChannel (Channel *c)
 
void CleanupChannels ()
 
void ClearChannelWatch ()
 
void UpdateLocalChannels (uint32 newZone)
 
void UpdateDefense ()
 
void UpdateWeaponSkill (Unit *victim, WeaponAttackType attType, Item *item=nullptr)
 
void UpdateCombatSkills (Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
 
void SetSkill (uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
 
uint16 GetMaxSkillValue (uint32 skill) const
 
uint16 GetPureMaxSkillValue (uint32 skill) const
 
uint16 GetSkillValue (uint32 skill) const
 
uint16 GetBaseSkillValue (uint32 skill) const
 
uint16 GetPureSkillValue (uint32 skill) const
 
int16 GetSkillPermBonusValue (uint32 skill) const
 
int16 GetSkillTempBonusValue (uint32 skill) const
 
uint16 GetSkillStep (uint16 skill) const
 
bool HasSkill (uint32 skill) const
 
void learnSkillRewardedSpells (uint32 id, uint32 value)
 
WorldLocationGetTeleportDest ()
 
bool IsBeingTeleported () const
 
bool IsBeingTeleportedNear () const
 
bool IsBeingTeleportedFar () const
 
void SetSemaphoreTeleportNear (time_t tm)
 
void SetSemaphoreTeleportFar (time_t tm)
 
time_t GetSemaphoreTeleportNear () const
 
time_t GetSemaphoreTeleportFar () const
 
void ProcessDelayedOperations ()
 
uint32 GetDelayedOperations () const
 
void ScheduleDelayedOperation (uint32 operation)
 
void CheckAreaExploreAndOutdoor ()
 
TeamId GetTeamId (bool original=false) const
 
void SetFactionForRace (uint8 race)
 
void setTeamId (TeamId teamid)
 
void InitDisplayIds ()
 
bool IsAtGroupRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtLootRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtRecruitAFriendDistance (WorldObject const *pOther) const
 
void RewardPlayerAndGroupAtKill (Unit *victim, bool isBattleGround)
 
void RewardPlayerAndGroupAtEvent (uint32 creature_id, WorldObject *pRewardSource)
 
bool isHonorOrXPTarget (Unit *victim) const
 
bool GetsRecruitAFriendBonus (bool forXP)
 
uint8 GetGrantableLevels ()
 
void SetGrantableLevels (uint8 val)
 
ReputationMgrGetReputationMgr ()
 
ReputationMgr const & GetReputationMgr () const
 
ReputationRank GetReputationRank (uint32 faction_id) const
 
void RewardReputation (Unit *victim)
 
void RewardReputation (Quest const *quest)
 
float CalculateReputationGain (ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
 
void UpdateSkillsForLevel ()
 
void UpdateSkillsToMaxSkillsForLevel ()
 
void ModifySkillBonus (uint32 skillid, int32 val, bool talent)
 
void RewardExtraBonusTalentPoints (uint32 bonusTalentPoints)
 
void UpdateHonorFields ()
 
bool RewardHonor (Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
 
uint32 GetHonorPoints () const
 
uint32 GetArenaPoints () const
 
void ModifyHonorPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 
void ModifyArenaPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 If trans is specified, honor save query will be added to trans. More...
 
uint32 GetMaxPersonalArenaRatingRequirement (uint32 minarenaslot) const
 If trans is specified, arena point save query will be added to trans. More...
 
void SetHonorPoints (uint32 value)
 
void SetArenaPoints (uint32 value)
 
void SaveHealthBeforeDuel ()
 
void SaveManaBeforeDuel ()
 
void RestoreHealthAfterDuel ()
 
void RestoreManaAfterDuel ()
 
SpellCooldowns GetSpellCooldowns () const
 
void SetDrunkValue (uint8 newDrunkValue, uint32 itemId=0)
 
uint8 GetDrunkValue () const
 
int32 GetFakeDrunkValue () const
 
void UpdateInvisibilityDrunkDetect ()
 
uint32 GetDeathTimer () const
 
uint32 GetCorpseReclaimDelay (bool pvp) const
 
void UpdateCorpseReclaimDelay ()
 
int32 CalculateCorpseReclaimDelay (bool load=false)
 
void SendCorpseReclaimDelay (uint32 delay)
 
uint32 GetShieldBlockValue () const override
 
bool CanParry () const
 
void SetCanParry (bool value)
 
bool CanBlock () const
 
void SetCanBlock (bool value)
 
bool CanTitanGrip () const
 
void SetCanTitanGrip (bool value)
 
bool CanTameExoticPets () const
 
void SetRegularAttackTime ()
 
void SetBaseModValue (BaseModGroup modGroup, BaseModType modType, float value)
 
void HandleBaseModValue (BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
 
float GetBaseModValue (BaseModGroup modGroup, BaseModType modType) const
 
float GetTotalBaseModValue (BaseModGroup modGroup) const
 
float GetTotalPercentageModValue (BaseModGroup modGroup) const
 
void _ApplyAllStatBonuses ()
 
void _RemoveAllStatBonuses ()
 
void ResetAllPowers ()
 
SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
 
void _ApplyWeaponDependentAuraMods (Item *item, WeaponAttackType attackType, bool apply)
 
void _ApplyWeaponDependentAuraCritMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyWeaponDependentAuraDamageMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyItemMods (Item *item, uint8 slot, bool apply)
 
void _RemoveAllItemMods ()
 
void _ApplyAllItemMods ()
 
void _ApplyAllLevelScaleItemMods (bool apply)
 
void _ApplyItemBonuses (ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
 
void _ApplyWeaponDamage (uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
 
void _ApplyAmmoBonuses ()
 
bool EnchantmentFitsRequirements (uint32 enchantmentcondition, int8 slot)
 
void ToggleMetaGemsActive (uint8 exceptslot, bool apply)
 
void CorrectMetaGemEnchants (uint8 slot, bool apply)
 
void InitDataForForm (bool reapplyMods=false)
 
void ApplyItemEquipSpell (Item *item, bool apply, bool form_change=false)
 
void ApplyEquipSpell (SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
 
void UpdateEquipSpellsAtFormChange ()
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
 
void CastItemUseSpell (Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item *item, ItemTemplate const *proto)
 
void SendEquipmentSetList ()
 
void SetEquipmentSet (uint32 index, EquipmentSet eqset)
 
void DeleteEquipmentSet (uint64 setGuid)
 
void SendInitWorldStates (uint32 zone, uint32 area)
 
void SendUpdateWorldState (uint32 variable, uint32 value) const
 
void SendDirectMessage (WorldPacket const *data) const
 
void SendBGWeekendWorldStates ()
 
void SendBattlefieldWorldStates ()
 
void GetAurasForTarget (Unit *target, bool force=false)
 
void SendLoot (ObjectGuid guid, LootType loot_type)
 
void SendLootError (ObjectGuid guid, LootError error)
 
void SendLootRelease (ObjectGuid guid)
 
void SendNotifyLootItemRemoved (uint8 lootSlot)
 
void SendNotifyLootMoneyRemoved ()
 
bool InBattleground () const
 
bool InArena () const
 
uint32 GetBattlegroundId () const
 
BattlegroundTypeId GetBattlegroundTypeId () const
 
uint32 GetCurrentBattlegroundQueueSlot () const
 
bool IsInvitedForBattlegroundInstance () const
 
bool IsCurrentBattlegroundRandom () const
 
BGDataGetBGData ()
 
void SetBGData (BGData &bgdata)
 
BattlegroundGetBattleground (bool create=false) const
 
bool InBattlegroundQueue (bool ignoreArena=false) const
 
bool IsDeserter () const
 
BattlegroundQueueTypeId GetBattlegroundQueueTypeId (uint32 index) const
 
uint32 GetBattlegroundQueueIndex (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool IsInvitedForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool InBattlegroundQueueForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
void SetBattlegroundId (uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
 
uint32 AddBattlegroundQueueId (BattlegroundQueueTypeId val)
 
bool HasFreeBattlegroundQueueId () const
 
void RemoveBattlegroundQueueId (BattlegroundQueueTypeId val)
 
void SetInviteForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
 
bool IsInvitedForBattlegroundInstance (uint32 instanceId) const
 
TeamId GetBgTeamId () const
 
void LeaveBattleground (Battleground *bg=nullptr)
 
bool CanJoinToBattleground () const
 
bool CanReportAfkDueToLimit ()
 
void ReportedAfkBy (Player *reporter)
 This player has been blamed to be inactive in a battleground. More...
 
void ClearAfkReports ()
 
bool GetBGAccessByLevel (BattlegroundTypeId bgTypeId) const
 
bool CanUseBattlegroundObject (GameObject *gameobject) const
 
bool isTotalImmune () const
 
bool CanCaptureTowerPoint () const
 
bool GetRandomWinner ()
 
void SetRandomWinner (bool isWinner)
 
OutdoorPvPGetOutdoorPvP () const
 
bool IsOutdoorPvPActive ()
 
bool IsImmuneToEnvironmentalDamage ()
 
uint32 EnvironmentalDamage (EnviromentalDamage type, uint32 damage)
 
void UpdateSpeakTime (ChatFloodThrottle::Index index)
 
bool CanSpeak () const
 
void UpdateFallInformationIfNeed (MovementInfo const &minfo, uint16 opcode)
 
void SetFallInformation (uint32 time, float z)
 
void HandleFall (MovementInfo const &movementInfo)
 
bool canFlyInZone (uint32 mapid, uint32 zone, SpellInfo const *bySpell)
 
void SetClientControl (Unit *target, bool allowMove, bool packetOnly=false)
 
void SetMover (Unit *target)
 
void SetSeer (WorldObject *target)
 
void SetViewpoint (WorldObject *target, bool apply)
 
WorldObjectGetViewpoint () const
 
void StopCastingCharm (Aura *except=nullptr)
 
void StopCastingBindSight (Aura *except=nullptr)
 
uint32 GetSaveTimer () const
 
void SetSaveTimer (uint32 timer)
 
void SaveRecallPosition ()
 
void SetHomebind (WorldLocation const &loc, uint32 areaId)
 
WorldLocation GetStartPosition () const
 
WorldLocation const & GetEntryPoint () const
 
void SetEntryPoint ()
 
bool HaveAtClient (WorldObject const *u) const
 
bool HaveAtClient (ObjectGuid guid) const
 
bool IsNeverVisible () const override
 
bool IsVisibleGloballyFor (Player const *player) const
 
void GetInitialVisiblePackets (Unit *target)
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void UpdateVisibilityForPlayer (bool mapChange=false)
 
void UpdateVisibilityOf (WorldObject *target)
 
void UpdateTriggerVisibility ()
 
template<class T >
void UpdateVisibilityOf (T *target, UpdateData &data, std::vector< Unit * > &visibleNow)
 
bool HasAtLoginFlag (AtLoginFlags f) const
 
void SetAtLoginFlag (AtLoginFlags f)
 
void RemoveAtLoginFlag (AtLoginFlags flags, bool persist=false)
 
bool isUsingLfg ()
 
bool inRandomLfgDungeon ()
 
uint32 GetTemporaryUnsummonedPetNumber () const
 
void SetTemporaryUnsummonedPetNumber (uint32 petnumber)
 
void UnsummonPetTemporaryIfAny ()
 
void ResummonPetTemporaryUnSummonedIfAny ()
 
bool IsPetNeedBeTemporaryUnsummoned () const
 
bool CanResummonPet (uint32 spellid)
 
void SendCinematicStart (uint32 CinematicSequenceId) const
 
void SendMovieStart (uint32 MovieId)
 
uint32 DoRandomRoll (uint32 minimum, uint32 maximum)
 
uint16 GetMaxSkillValueForLevel () const
 
bool IsFFAPvP ()
 
bool IsPvP ()
 
void UpdateHomebindTime (uint32 time)
 
void BindToInstance ()
 
void SetPendingBind (uint32 instanceId, uint32 bindTimer)
 
bool HasPendingBind () const
 
uint32 GetPendingBind () const
 
void SendRaidInfo ()
 
void SendSavedInstances ()
 
void PrettyPrintRequirementsQuestList (const std::vector< const ProgressionRequirement * > &missingQuests) const
 
void PrettyPrintRequirementsAchievementsList (const std::vector< const ProgressionRequirement * > &missingAchievements) const
 
void PrettyPrintRequirementsItemsList (const std::vector< const ProgressionRequirement * > &missingItems) const
 
bool Satisfy (DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
 
bool CheckInstanceLoginValid ()
 
bool CheckInstanceCount (uint32 instanceId) const
 
void AddInstanceEnterTime (uint32 instanceId, time_t enterTime)
 
uint32 GetLastPetNumber () const
 
void SetLastPetNumber (uint32 petnumber)
 
uint32 GetLastPetSpell () const
 
void SetLastPetSpell (uint32 petspell)
 
GroupGetGroupInvite ()
 
void SetGroupInvite (Group *group)
 
GroupGetGroup ()
 
const GroupGetGroup () const
 
GroupReferenceGetGroupRef ()
 
void SetGroup (Group *group, int8 subgroup=-1)
 
uint8 GetSubGroup () const
 
uint32 GetGroupUpdateFlag () const
 
void SetGroupUpdateFlag (uint32 flag)
 
uint64 GetAuraUpdateMaskForRaid () const
 
void SetAuraUpdateMaskForRaid (uint8 slot)
 
PlayerGetNextRandomRaidMember (float radius)
 
PartyResult CanUninviteFromGroup (ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
 
void SetBattlegroundOrBattlefieldRaid (Group *group, int8 subgroup=-1)
 
void RemoveFromBattlegroundOrBattlefieldRaid ()
 
GroupGetOriginalGroup ()
 
GroupReferenceGetOriginalGroupRef ()
 
uint8 GetOriginalSubGroup () const
 
void SetOriginalGroup (Group *group, int8 subgroup=-1)
 
void SetPassOnGroupLoot (bool bPassOnGroupLoot)
 
bool GetPassOnGroupLoot () const
 
MapReferenceGetMapRef ()
 
void SetMap (Map *map) override
 
void ResetMap () override
 
bool CanTeleport ()
 
void SetCanTeleport (bool value)
 
bool CanKnockback ()
 
void SetCanKnockback (bool value)
 
bool isAllowedToLoot (Creature const *creature)
 
DeclinedName const * GetDeclinedNames () const
 
uint8 GetRunesState () const
 
RuneType GetBaseRune (uint8 index) const
 
RuneType GetCurrentRune (uint8 index) const
 
uint32 GetRuneCooldown (uint8 index) const
 
uint32 GetGracePeriod (uint8 index) const
 
uint32 GetRuneBaseCooldown (uint8 index, bool skipGrace)
 
bool IsBaseRuneSlotsOnCooldown (RuneType runeType) const
 
RuneType GetLastUsedRune ()
 
void SetLastUsedRune (RuneType type)
 
void SetBaseRune (uint8 index, RuneType baseRune)
 
void SetCurrentRune (uint8 index, RuneType currentRune)
 
void SetRuneCooldown (uint8 index, uint32 cooldown)
 
void SetGracePeriod (uint8 index, uint32 period)
 
void SetRuneConvertAura (uint8 index, AuraEffect const *aura)
 
void AddRuneByAuraEffect (uint8 index, RuneType newType, AuraEffect const *aura)
 
void RemoveRunesByAuraEffect (AuraEffect const *aura)
 
void RestoreBaseRune (uint8 index)
 
void ConvertRune (uint8 index, RuneType newType)
 
void ResyncRunes (uint8 count)
 
void AddRunePower (uint8 index)
 
void InitRunes ()
 
void SendRespondInspectAchievements (Player *player) const
 
bool HasAchieved (uint32 achievementId) const
 
void ResetAchievements ()
 
void CheckAllAchievementCriteria ()
 
void ResetAchievementCriteria (AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
 
void UpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void StartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
 
void RemoveTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void CompletedAchievement (AchievementEntry const *entry)
 
AchievementMgrGetAchievementMgr () const
 
void SetCreationTime (Seconds creationTime)
 
Seconds GetCreationTime () const
 
bool HasTitle (uint32 bitIndex) const
 
bool HasTitle (CharTitlesEntry const *title) const
 
void SetTitle (CharTitlesEntry const *title, bool lost=false)
 
void SetCurrentTitle (CharTitlesEntry const *title, bool clear=false)
 
bool CanSeeSpellClickOn (Creature const *creature) const
 
bool CanSeeVendor (Creature const *creature) const
 
uint32 GetChampioningFaction () const
 
void SetChampioningFaction (uint32 faction)
 
float GetAverageItemLevel ()
 
float GetAverageItemLevelForDF ()
 
void ClearWhisperWhiteList ()
 
void AddWhisperWhiteList (ObjectGuid guid)
 
bool IsInWhisperWhiteList (ObjectGuid guid)
 
void RemoveFromWhisperWhiteList (ObjectGuid guid)
 
bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool SetCanFly (bool apply, bool packetOnly=false) override
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
bool SetWaterWalking (bool apply, bool packetOnly=false) override
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
bool SetFeatherFall (bool apply, bool packetOnly=false) override
 
bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool CanFly () const override
 
bool CanEnterWater () const override
 
void AdditionalSavingAddMask (uint8 mask)
 
bool IsSpectator () const
 
void SetIsSpectator (bool on)
 
bool NeedSendSpectatorData () const
 
void SetPendingSpectatorForBG (uint32 bgInstanceId)
 
bool HasPendingSpectatorForBG (uint32 bgInstanceId) const
 
void SetPendingSpectatorInviteInstanceId (uint32 bgInstanceId)
 
uint32 GetPendingSpectatorInviteInstanceId () const
 
bool HasReceivedSpectatorResetFor (ObjectGuid guid)
 
void ClearReceivedSpectatorResetFor ()
 
void AddReceivedSpectatorResetFor (ObjectGuid guid)
 
void RemoveReceivedSpectatorResetFor (ObjectGuid guid)
 
void setRuneWeaponGUID (ObjectGuid guid)
 
ObjectGuid getRuneWeaponGUID ()
 
bool CanSeeDKPet () const
 
void SetShowDKPet (bool on)
 
void PrepareCharmAISpells ()
 
bool NeedToSaveGlyphs ()
 
void SetNeedToSaveGlyphs (bool val)
 
uint32 GetMountBlockId ()
 
void SetMountBlockId (uint32 mount)
 
float GetRealParry () const
 
float GetRealDodge () const
 
const PlayerTalentMapGetTalentMap () const
 
uint32 GetNextSave () const
 
SpellModList const & GetSpellModList (uint32 type) const
 
void SetServerSideVisibility (ServerSideVisibilityType type, AccountTypes sec)
 
void SetServerSideVisibilityDetect (ServerSideVisibilityType type, AccountTypes sec)
 
void SetFarSightDistance (float radius)
 
void ResetFarSightDistance ()
 
Optional< float > GetFarSightDistance () const
 
float GetSightRange (WorldObject const *target=nullptr) const override
 
std::string GetPlayerName ()
 
PlayerSetting GetPlayerSetting (std::string source, uint8 index)
 
void UpdatePlayerSetting (std::string source, uint8 index, uint32 value)
 
void SendSystemMessage (std::string_view msg, bool escapeCharacters=false)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Unit
 ~Unit () override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
void Update (uint32 time) override
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells. More...
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client. More...
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop() More...
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead. More...
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
bool CanFreeMove () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
uint32 GetResistance (SpellSchools school) const
 
uint32 GetResistance (SpellSchoolMask mask) const
 
void SetResistance (SpellSchools school, int32 val)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
float GetHealthPct () const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
float GetPowerPct (Powers power) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
int32 GetHealthGain (int32 dVal)
 
Powers getPowerType () const
 
void setPowerType (Powers power)
 
virtual bool HasActivePowerType (Powers power)
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only. More...
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h. More...
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint32 GetFaction () const
 
void SetFaction (uint32 faction)
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
void HandleEmoteCommand (uint32 emoteId)
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
bool CanUseAttackType (uint8 attacktype) const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
NPCFlags GetNpcFlags () const
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
bool IsCritter () const
 
bool IsInFlight () const
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
virtual bool HasSpell (uint32) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
bool HasStealthAura () const
 
bool HasInvisibilityAura () const
 
bool isFeared () const
 
bool isInRoots () const
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
void DeMorph ()
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
void SendMovementFlagUpdate (bool self=false)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
PlayerGetSpellModOwner () const
 
UnitGetOwner () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
PlayerGetAffectingPlayer () const
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void SetCharm (Unit *target, bool apply)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void RemoveCharmedBy (Unit *charmer)
 
void RestoreFaction ()
 
UnitGetFirstControlled () const
 
void RemoveAllControlled (bool onDeath=false)
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
void DeleteCharmInfo ()
 
void UpdateCharmAI ()
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
void RemoveBindSightAuras ()
 
void RemoveCharmAuras ()
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
void InitStatBuffMods ()
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
void SetCreateStat (Stats stat, float val)
 
void SetCreateHealth (uint32 val)
 
uint32 GetCreateHealth () const
 
void SetCreateMana (uint32 val)
 
uint32 GetCreateMana () const
 
uint32 GetCreatePowers (Powers power) const
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
float GetCreateStat (Stats stat) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool IsMovementPreventedByCasting () const
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsInFeralForm () const
 
bool IsInDisallowedMountForm () const
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
bool CanModifyStats () const
 
void SetCanModifyStats (bool modifyStats)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
bool CanHaveThreatList () const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
void UnsummonAllTotems (bool onDeath=false)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline. More...
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 --------—Combo point system----------------— More...
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void SendComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void propagateSpeedChange ()
 -------—End of Pet responses methods-------— More...
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
void UpdateAuraForGroup (uint8 slot)
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
ObjectGuid GetTransGUID () const override
 
TransportBaseGetDirectTransport () const
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void BuildMovementPacket (ByteBuffer *data) const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool CanEnterWater () const =0
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
virtual float GetFollowAngle () const
 
void OutDebugInfo () const
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
bool CanApplyResilience () const
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
std::string GetDebugInfo () const override
 
uint32 GetOldFactionId () const
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 
- Public Member Functions inherited from GridObject< Player >
bool IsInGrid () const
 
void AddToGrid (GridRefMgr< Player > &m)
 
void RemoveFromGrid ()
 

Static Public Member Functions

static bool BuildEnumData (PreparedQueryResult result, WorldPacket *data)
 
static uint8 GetAttackBySlot (uint8 slot)
 
static bool IsInventoryPos (uint16 pos)
 
static bool IsInventoryPos (uint8 bag, uint8 slot)
 
static bool IsEquipmentPos (uint16 pos)
 
static bool IsEquipmentPos (uint8 bag, uint8 slot)
 
static bool IsBagPos (uint16 pos)
 
static bool IsBankPos (uint16 pos)
 
static bool IsBankPos (uint8 bag, uint8 slot)
 
static uint32 GetDefaultGossipMenuForSource (WorldObject *source)
 
static uint32 GetZoneIdFromDB (ObjectGuid guid)
 
static bool LoadPositionFromDB (uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
 
static bool IsValidGender (uint8 Gender)
 
static void Customize (CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
 
static void SavePositionInDB (uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
 
static void SavePositionInDB (WorldLocation const &loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans)
 
static void DeleteFromDB (ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
 
static void DeleteOldCharacters ()
 
static void DeleteOldCharacters (uint32 keepDays)
 
static void RemoveFromGroup (Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
 
static void RemovePetitionsAndSigns (ObjectGuid guid, uint32 type)
 
static uint32 GetArenaTeamIdFromDB (ObjectGuid guid, uint8 slot)
 
static void LeaveAllArenaTeams (ObjectGuid guid)
 
static void ResetInstances (ObjectGuid guid, uint8 method, bool isRaid)
 Reset all solo instances and optionally send a message on success for each. More...
 
static void OfflineResurrect (ObjectGuid const guid, CharacterDatabaseTransaction trans)
 
static TeamId TeamIdForRace (uint8 race)
 
static DrunkenState GetDrunkenstateByValue (uint8 value)
 
- Static Public Member Functions inherited from Unit
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

std::string autoReplyMsg
 
PlayerTaxi m_taxi
 
time_t m_logintime
 
time_t m_Last_tick
 
uint32 m_Played_time [MAX_PLAYED_TIME_INDEX]
 
bool m_mailsUpdated
 
uint8 unReadMails
 
time_t m_nextMailDelivereTime
 
ItemMap mMitems
 
PvPInfo pvpInfo
 
std::unique_ptr< DuelInfoduel
 
PlayerMenuPlayerTalkClass
 
std::vector< ItemSetEffect * > ItemSetEff
 
SafeUnitPointer m_mover
 
WorldObjectm_seer
 
std::set< Unit * > m_isInSharedVisionOf
 
uint32 m_recallMap
 
float m_recallX
 
float m_recallY
 
float m_recallZ
 
float m_recallO
 
uint32 m_homebindMapId
 
uint16 m_homebindAreaId
 
float m_homebindX
 
float m_homebindY
 
float m_homebindZ
 
GuidUnorderedSet m_clientGUIDs
 
std::vector< Unit * > m_newVisible
 
uint8 m_forced_speed_changes [MAX_MOVE_TYPE]
 
DFQuestsDoneList m_DFQuests
 
uint32 m_HomebindTimer
 
bool m_InstanceValid
 
Spellm_spellModTakingSpell
 
bool isDebugAreaTriggers
 
uint32 m_pendingSpectatorForBG
 
uint32 m_pendingSpectatorInviteInstanceId
 
GuidSet m_receivedSpectatorResetFor
 
ObjectGuid m_drwGUID
 
uint32 m_charmUpdateTimer
 
- Public Attributes inherited from Unit
uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
EventProcessor m_Events
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Static Public Attributes

static std::unordered_map< int, bgZoneRefbgZoneIdToFillWorldStates = {}
 

Protected Types

typedef std::set< uint32QuestSet
 
typedef std::set< uint32SeasonalQuestSet
 
typedef std::unordered_map< uint32, SeasonalQuestSetSeasonalEventQuestMap
 
typedef std::list< Channel * > JoinedChannelsList
 
- Protected Types inherited from Unit
typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

void _LoadActions (PreparedQueryResult result)
 
void _LoadAuras (PreparedQueryResult result, uint32 timediff)
 
void _LoadGlyphAuras ()
 
void _LoadInventory (PreparedQueryResult result, uint32 timeDiff)
 
void _LoadMail (PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
 
void _LoadQuestStatus (PreparedQueryResult result)
 
void _LoadQuestStatusRewarded (PreparedQueryResult result)
 
void _LoadDailyQuestStatus (PreparedQueryResult result)
 
void _LoadWeeklyQuestStatus (PreparedQueryResult result)
 
void _LoadMonthlyQuestStatus (PreparedQueryResult result)
 
void _LoadSeasonalQuestStatus (PreparedQueryResult result)
 
void _LoadRandomBGStatus (PreparedQueryResult result)
 
void _LoadGroup ()
 
void _LoadSkills (PreparedQueryResult result)
 
void _LoadSpells (PreparedQueryResult result)
 
void _LoadFriendList (PreparedQueryResult result)
 
bool _LoadHomeBind (PreparedQueryResult result)
 
void _LoadDeclinedNames (PreparedQueryResult result)
 
void _LoadArenaTeamInfo ()
 
void _LoadEquipmentSets (PreparedQueryResult result)
 
void _LoadEntryPointData (PreparedQueryResult result)
 
void _LoadGlyphs (PreparedQueryResult result)
 
void _LoadTalents (PreparedQueryResult result)
 
void _LoadInstanceTimeRestrictions (PreparedQueryResult result)
 
void _LoadBrewOfTheMonth (PreparedQueryResult result)
 
void _LoadCharacterSettings (PreparedQueryResult result)
 
void _LoadPetStable (uint8 petStableSlots, PreparedQueryResult result)
 
void _SaveActions (CharacterDatabaseTransaction trans)
 
void _SaveAuras (CharacterDatabaseTransaction trans, bool logout)
 
void _SaveInventory (CharacterDatabaseTransaction trans)
 
void _SaveMail (CharacterDatabaseTransaction trans)
 
void _SaveQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveDailyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveWeeklyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveMonthlyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSeasonalQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSpells (CharacterDatabaseTransaction trans)
 
void _SaveEquipmentSets (CharacterDatabaseTransaction trans)
 
void _SaveEntryPoint (CharacterDatabaseTransaction trans)
 
void _SaveGlyphs (CharacterDatabaseTransaction trans)
 
void _SaveTalents (CharacterDatabaseTransaction trans)
 
void _SaveStats (CharacterDatabaseTransaction trans)
 
void _SaveCharacter (bool create, CharacterDatabaseTransaction trans)
 
void _SaveInstanceTimeRestrictions (CharacterDatabaseTransaction trans)
 
void _SavePlayerSettings (CharacterDatabaseTransaction trans)
 
void HandleSobering ()
 The player sobers by 1% every 9 seconds. More...
 
void SendMirrorTimer (MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
 
void StopMirrorTimer (MirrorTimerType Type)
 
void HandleDrowning (uint32 time_diff)
 
int32 getMaxTimer (MirrorTimerType timer)
 
void outDebugValues () const
 
void SendQuestGiverStatusMultiple ()
 
bool CanAlwaysSee (WorldObject const *obj) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
- Protected Member Functions inherited from Unit
 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Static Protected Member Functions

static Item_LoadMailedItem (ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
 

Protected Attributes

WhisperListContainer WhisperList
 
bool m_NeedToSaveGlyphs
 
uint32 m_MountBlockId
 
float m_realDodge
 
float m_realParry
 
uint32 m_charmAISpells [NUM_CAI_SPELLS]
 
uint32 m_AreaID
 
uint32 m_regenTimerCount
 
uint32 m_foodEmoteTimerCount
 
float m_powerFraction [MAX_POWERS]
 
uint32 m_contestedPvPTimer
 
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES_BgBattlegroundQueueID
 
BGData m_bgData
 
bool m_IsBGRandomWinner
 
EntryPointData m_entryPointData
 
QuestSet m_timedquests
 
QuestSet m_weeklyquests
 
QuestSet m_monthlyquests
 
SeasonalEventQuestMap m_seasonalquests
 
ObjectGuid m_divider
 
uint32 m_ingametime
 
time_t m_lastHonorUpdateTime
 
ObjectGuid m_lootGuid
 
TeamId m_team
 
uint32 m_nextSave
 
uint16 m_additionalSaveTimer
 
uint8 m_additionalSaveMask
 
uint16 m_hostileReferenceCheckTimer
 
std::array< ChatFloodThrottle, ChatFloodThrottle::MAXm_chatFloodData
 
Difficulty m_dungeonDifficulty
 
Difficulty m_raidDifficulty
 
Difficulty m_raidMapDifficulty
 
uint32 m_atLoginFlags
 
Itemm_items [PLAYER_SLOTS_COUNT]
 
uint32 m_currentBuybackSlot
 
std::vector< Item * > m_itemUpdateQueue
 
bool m_itemUpdateQueueBlocked
 
uint32 m_ExtraFlags
 
QuestStatusMap m_QuestStatus
 
QuestStatusSaveMap m_QuestStatusSave
 
RewardedQuestSet m_RewardedQuests
 
QuestStatusSaveMap m_RewardedQuestsSave
 
SkillStatusMap mSkillStatus
 
uint32 m_GuildIdInvited
 
uint32 m_ArenaTeamIdInvited
 
PlayerMails m_mail
 
PlayerSpellMap m_spells
 
PlayerTalentMap m_talents
 
uint32 m_lastPotionId
 
GlobalCooldownMgr m_GlobalCooldownMgr
 
uint8 m_activeSpec
 
uint8 m_specsCount
 
uint32 m_Glyphs [MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
 
ActionButtonList m_actionButtons
 
float m_auraBaseMod [BASEMOD_END][MOD_END]
 
int32 m_baseRatingValue [MAX_COMBAT_RATING]
 
uint32 m_baseSpellPower
 
uint32 m_baseFeralAP
 
uint32 m_baseManaRegen
 
uint32 m_baseHealthRegen
 
int32 m_spellPenetrationItemMod
 
SpellModList m_spellMods [MAX_SPELLMOD]
 
EnchantDurationList m_enchantDuration
 
ItemDurationList m_itemDuration
 
ItemDurationList m_itemSoulboundTradeable
 
std::mutex m_soulboundTradableLock
 
ObjectGuid m_resurrectGUID
 
uint32 m_resurrectMap
 
float m_resurrectX
 
float m_resurrectY
 
float m_resurrectZ
 
uint32 m_resurrectHealth
 
uint32 m_resurrectMana
 
WorldSessionm_session
 
JoinedChannelsList m_channels
 
uint8 m_cinematic
 
TradeDatam_trade
 
bool m_DailyQuestChanged
 
bool m_WeeklyQuestChanged
 
bool m_MonthlyQuestChanged
 
bool m_SeasonalQuestChanged
 
time_t m_lastDailyQuestTime
 
uint32 m_drunkTimer
 
uint32 m_weaponChangeTimer
 
uint32 m_zoneUpdateId
 
uint32 m_zoneUpdateTimer
 
uint32 m_areaUpdateId
 
uint32 m_deathTimer
 
time_t m_deathExpireTime
 
uint32 m_WeaponProficiency
 
uint32 m_ArmorProficiency
 
bool m_canParry
 
bool m_canBlock
 
bool m_canTitanGrip
 
uint8 m_swingErrorMsg
 
float m_ammoDPS
 
time_t _restTime
 
uint32 _innTriggerId
 
float _restBonus
 
uint32 _restFlagMask
 
uint32 m_resetTalentsCost
 
time_t m_resetTalentsTime
 
uint32 m_usedTalentCount
 
uint32 m_questRewardTalentCount
 
uint32 m_extraBonusTalentCount
 
PlayerSocialm_social
 
GroupReference m_group
 
GroupReference m_originalGroup
 
Groupm_groupInvite
 
uint32 m_groupUpdateMask
 
uint64 m_auraRaidUpdateMask
 
bool m_bPassOnGroupLoot
 
uint32 m_lastpetnumber
 
time_t m_summon_expire
 
uint32 m_summon_mapid
 
float m_summon_x
 
float m_summon_y
 
float m_summon_z
 
bool m_summon_asSpectator
 
DeclinedNamem_declinedname
 
Runesm_runes
 
EquipmentSets m_EquipmentSets
 
uint8 m_grantableLevels
 
bool m_needZoneUpdate
 
- Protected Attributes inherited from Unit
UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef GuidSet RefundableItemsSet
 

Private Member Functions

InventoryResult CanStoreItem_InSpecificSlot (uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
 
InventoryResult CanStoreItem_InBag (uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
InventoryResult CanStoreItem_InInventorySlots (uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
Item_StoreItem (uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
 
Item_LoadItem (CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
 
void SendRefundInfo (Item *item)
 
void RefundItem (Item *item)
 
void AddKnownCurrency (uint32 itemId)
 
void AdjustQuestReqItemCount (Quest const *quest, QuestStatusData &questStatusData)
 
bool MustDelayTeleport () const
 
void SetMustDelayTeleport (bool setting)
 
bool HasDelayedTeleport () const
 
void SetHasDelayedTeleport (bool setting)
 
void UpdateCharmedAI ()
 

Private Attributes

CinematicMgr_cinematicMgr
 
RefundableItemsSet m_refundableItems
 
MapReference m_mapRef
 
uint32 m_lastFallTime
 
float m_lastFallZ
 
int32 m_MirrorTimer [MAX_TIMERS]
 
uint8 m_MirrorTimerFlags
 
uint8 m_MirrorTimerFlagsLast
 
bool m_isInWater
 
WorldLocation teleportStore_dest
 
uint32 teleportStore_options
 
time_t mSemaphoreTeleport_Near
 
time_t mSemaphoreTeleport_Far
 
uint32 m_DelayedOperations
 
bool m_bMustDelayTeleport
 
bool m_bHasDelayedTeleport
 
bool m_canTeleport
 
bool m_canKnockback
 
std::unique_ptr< PetStablem_petStable
 
uint32 m_temporaryUnsummonedPetNumber
 
uint32 m_oldpetspell
 
AchievementMgrm_achievementMgr
 
ReputationMgrm_reputationMgr
 
SpellCooldowns m_spellCooldowns
 
uint32 m_ChampioningFaction
 
InstanceTimeMap _instanceResetTimes
 
uint32 _pendingBindId
 
uint32 _pendingBindTimer
 
uint32 _activeCheats
 
uint32 healthBeforeDuel
 
uint32 manaBeforeDuel
 
bool m_isInstantFlightOn
 
uint32 m_flightSpellActivated
 
WorldLocation _corpseLocation
 
Optional< float > _farSightDistance = { }
 
bool _wasOutdoor
 
PlayerSettingMap m_charSettingsMap
 
Seconds m_creationTime
 

Friends

class WorldSession
 
class CinematicMgr
 
void Item::AddToUpdateQueueOf (Player *player)
 
void Item::RemoveFromUpdateQueueOf (Player *player)
 

Detailed Description

Member Typedef Documentation

◆ DFQuestsDoneList

typedef std::set<uint32> Player::DFQuestsDoneList

◆ ItemMap

typedef std::unordered_map<ObjectGuid::LowType, Item*> Player::ItemMap

◆ JoinedChannelsList

typedef std::list<Channel*> Player::JoinedChannelsList
protected

◆ QuestSet

typedef std::set<uint32> Player::QuestSet
protected

◆ RefundableItemsSet

◆ SeasonalEventQuestMap

typedef std::unordered_map<uint32, SeasonalQuestSet> Player::SeasonalEventQuestMap
protected

◆ SeasonalQuestSet

typedef std::set<uint32> Player::SeasonalQuestSet
protected

Constructor & Destructor Documentation

◆ Player()

Player::Player ( WorldSession session)
explicit
145 : Unit(true), m_mover(this)
146{
147#ifdef _MSC_VER
148#pragma warning(default:4355)
149#endif
150
153
155
156 m_session = session;
157
158 m_ingametime = 0;
159
160 m_ExtraFlags = 0;
161
162 m_spellModTakingSpell = nullptr;
163 //m_pad = 0;
164
165 // players always accept
167 SetAcceptWhispers(true);
168
172
173 m_regenTimer = 0;
177
180
181 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
182
183 m_areaUpdateId = 0;
185
186 m_needZoneUpdate = false;
187
191
193
194 memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
195
196 m_social = nullptr;
197
198 // group is initialized in the reference constructor
199 SetGroupInvite(nullptr);
202 m_bPassOnGroupLoot = false;
203
206
208
211
213 m_bMustDelayTeleport = false;
214 m_bHasDelayedTeleport = false;
216 m_canTeleport = false;
217 m_canKnockback = false;
218
219 m_trade = nullptr;
220
221 m_cinematic = 0;
222
225
226 m_DailyQuestChanged = false;
228
229 for (uint8 i = 0; i < MAX_TIMERS; i++)
231
234 m_isInWater = false;
235 m_drunkTimer = 0;
236 m_deathTimer = 0;
238
240
241 m_swingErrorMsg = 0;
242
243 for (uint8 j = 0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; ++j)
244 {
246 _BgBattlegroundQueueID[j].invitedToInstance = 0;
247 }
248
255 m_canParry = false;
256 m_canBlock = false;
257 m_canTitanGrip = false;
258 m_ammoDPS = 0.0f;
259
261 //cache for UNIT_CREATED_BY_SPELL to allow
262 //returning reagents for temporarily removed pets
263 //when dying/logging out
264 m_oldpetspell = 0;
265 m_lastpetnumber = 0;
266
268 _restTime = 0;
269 _innTriggerId = 0;
270 _restBonus = 0;
271 _restFlagMask = 0;
273
274 m_mailsUpdated = false;
275 unReadMails = 0;
276 m_nextMailDelivereTime = time_t(0);
277
281
282 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
284
286
287 m_HomebindTimer = 0;
288 m_InstanceValid = true;
292
293 m_lastPotionId = 0;
294
295 m_activeSpec = 0;
296 m_specsCount = 1;
297
298 for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i)
299 {
300 for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g)
301 m_Glyphs[i][g] = 0;
302 }
303
304 for (uint8 i = 0; i < BASEMOD_END; ++i)
305 {
306 m_auraBaseMod[i][FLAT_MOD] = 0.0f;
307 m_auraBaseMod[i][PCT_MOD] = 1.0f;
308 }
309
310 for (uint8 i = 0; i < MAX_COMBAT_RATING; i++)
311 m_baseRatingValue[i] = 0;
312
314 m_baseFeralAP = 0;
315 m_baseManaRegen = 0;
318
319 // Honor System
321
322 m_IsBGRandomWinner = false;
323
324 // Player summoning
325 m_summon_expire = 0;
326 m_summon_mapid = 0;
327 m_summon_x = 0.0f;
328 m_summon_y = 0.0f;
329 m_summon_z = 0.0f;
330 m_summon_asSpectator = false;
331
332 //m_mover = this;
334 m_seer = this;
335
336 m_recallMap = 0;
337 m_recallX = 0;
338 m_recallY = 0;
339 m_recallZ = 0;
340 m_recallO = 0;
341
342 m_homebindMapId = 0;
344 m_homebindX = 0;
345 m_homebindY = 0;
346 m_homebindZ = 0;
347
349
350 m_declinedname = nullptr;
351
352 m_isActive = true;
353
354 m_runes = nullptr;
355
356 m_lastFallTime = 0;
357 m_lastFallZ = 0;
358
360
362
363 sWorld->IncreasePlayerCount();
364
366
367 for (uint8 i = 0; i < MAX_POWERS; ++i)
368 m_powerFraction[i] = 0;
369
370 isDebugAreaTriggers = false;
371
372 m_WeeklyQuestChanged = false;
373
374 m_MonthlyQuestChanged = false;
375
377
378 SetPendingBind(0, 0);
379
381
382 m_creationTime = 0s;
383
384 _cinematicMgr = new CinematicMgr(this);
385
387 m_reputationMgr = new ReputationMgr(this);
388
389 // Ours
390 m_NeedToSaveGlyphs = false;
391 m_MountBlockId = 0;
392 m_realDodge = 0.0f;
393 m_realParry = 0.0f;
396
398
399 for( int i = 0; i < NUM_CAI_SPELLS; ++i )
400 m_charmAISpells[i] = 0;
401
402 m_applyResilience = true;
403
404 m_isInstantFlightOn = true;
405
406 _wasOutdoor = true;
407 sScriptMgr->OnConstructPlayer(this);
408}
@ TYPEID_PLAYER
Definition: ObjectGuid.h:36
@ TYPEMASK_PLAYER
Definition: ObjectGuid.h:50
@ PLAYER_END
Definition: UpdateFields.h:392
@ NUM_CAI_SPELLS
Definition: Player.h:924
@ CHEAT_NONE
Definition: Player.h:997
@ BUYBACK_SLOT_START
Definition: Player.h:724
#define MAX_TIMERS
Definition: Player.h:578
#define DISABLED_MIRROR_TIMER
Definition: Player.h:579
@ PLAYED_TIME_TOTAL
Definition: Player.h:855
@ PLAYED_TIME_LEVEL
Definition: Player.h:856
@ UNDERWATER_NONE
Definition: Player.h:100
@ AT_LOGIN_NONE
Definition: Player.h:599
@ PLAYER_SLOTS_COUNT
Definition: Player.h:667
@ FLAT_MOD
Definition: Unit.h:189
@ PCT_MOD
Definition: Unit.h:190
#define MAX_COMBAT_RATING
Definition: Unit.h:244
@ BASEMOD_END
Definition: Unit.h:184
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:339
#define sScriptMgr
Definition: ScriptMgr.h:707
@ CONFIG_INTERVAL_SAVE
Definition: IWorld.h:218
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition: DBCEnums.h:273
@ DUNGEON_DIFFICULTY_NORMAL
Definition: DBCEnums.h:269
@ MAX_POWERS
Definition: SharedDefines.h:276
#define MAX_TALENT_SPECS
Definition: SharedDefines.h:675
#define MAX_GLYPH_SLOT_INDEX
Definition: SharedDefines.h:676
@ BATTLEGROUND_QUEUE_NONE
Definition: SharedDefines.h:3620
@ TEAM_NEUTRAL
Definition: SharedDefines.h:762
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition: SharedDefines.h:176
std::uint8_t uint8
Definition: Define.h:109
std::uint32_t uint32
Definition: Define.h:107
#define sWorld
Definition: World.h:444
bool IsPlayerAccount(uint32 gmlevel)
Definition: AccountMgr.cpp:305
uint32 GetSecurity(uint32 accountId)
Definition: AccountMgr.cpp:238
Seconds GetGameTime()
Definition: GameTime.cpp:38
Definition: AchievementMgr.h:280
Definition: GossipDef.h:258
Definition: Item.h:220
uint16 m_objectType
Definition: Object.h:238
uint16 m_valuesCount
Definition: Object.h:252
TypeID m_objectTypeId
Definition: Object.h:240
bool m_isActive
Definition: Object.h:637
bool m_canParry
Definition: Player.h:2835
time_t m_summon_expire
Definition: Player.h:2868
bool m_needZoneUpdate
Definition: Player.h:2885
uint16 m_additionalSaveTimer
Definition: Player.h:2742
float m_ammoDPS
Definition: Player.h:2839
uint32 m_temporaryUnsummonedPetNumber
Definition: Player.h:2939
uint32 m_ChampioningFaction
Definition: Player.h:2947
bool m_bHasDelayedTeleport
Definition: Player.h:2932
bool m_InstanceValid
Definition: Player.h:2412
time_t m_deathExpireTime
Definition: Player.h:2831
ReputationMgr * m_reputationMgr
Definition: Player.h:2943
float m_auraBaseMod[BASEMOD_END][MOD_END]
Definition: Player.h:2786
float m_homebindZ
Definition: Player.h:2349
uint32 m_lastFallTime
Definition: Player.h:2916
uint32 m_lastPotionId
Definition: Player.h:2775
CinematicMgr * _cinematicMgr
Definition: Player.h:2895
bool m_canTeleport
Definition: Player.h:2933
uint32 m_usedTalentCount
Definition: Player.h:2849
friend class CinematicMgr
Definition: Player.h:1065
bool m_MonthlyQuestChanged
Definition: Player.h:2819
PlayerSocial * m_social
Definition: Player.h:2854
uint32 m_homebindMapId
Definition: Player.h:2345
Seconds m_creationTime
Definition: Player.h:2971
void SetAcceptWhispers(bool on)
Definition: Player.h:1156
float m_summon_z
Definition: Player.h:2872
time_t m_lastHonorUpdateTime
Definition: Player.h:2735
time_t _restTime
Definition: Player.h:2842
SafeUnitPointer m_mover
Definition: Player.h:2309
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2376
uint32 _activeCheats
Definition: Player.h:2953
uint32 m_resetTalentsCost
Definition: Player.h:2847
uint8 m_MirrorTimerFlags
Definition: Player.h:2920
uint32 m_atLoginFlags
Definition: Player.h:2750
uint32 m_ExtraFlags
Definition: Player.h:2758
float m_recallX
Definition: Player.h:2336
uint32 m_ingametime
Definition: Player.h:2665
float m_recallO
Definition: Player.h:2339
bool m_WeeklyQuestChanged
Definition: Player.h:2818
uint8 unReadMails
Definition: Player.h:1644
uint32 m_pendingSpectatorInviteInstanceId
Definition: Player.h:2564
void SetGroupInvite(Group *group)
Definition: Player.h:2443
uint32 m_DelayedOperations
Definition: Player.h:2930
TradeData * m_trade
Definition: Player.h:2815
float m_realParry
Definition: Player.h:2621
uint32 m_nextSave
Definition: Player.h:2741
uint32 m_zoneUpdateTimer
Definition: Player.h:2827
bool m_mailsUpdated
Definition: Player.h:1580
time_t mSemaphoreTeleport_Far
Definition: Player.h:2928
float _restBonus
Definition: Player.h:2844
uint32 m_foodEmoteTimerCount
Definition: Player.h:2627
uint32 m_baseFeralAP
Definition: Player.h:2789
float m_summon_y
Definition: Player.h:2871
WorldObject * m_seer
Definition: Player.h:2310
float m_summon_x
Definition: Player.h:2870
uint32 m_charmAISpells[NUM_CAI_SPELLS]
Definition: Player.h:2623
uint8 m_additionalSaveMask
Definition: Player.h:2743
bool m_bMustDelayTeleport
Definition: Player.h:2931
bool m_SeasonalQuestChanged
Definition: Player.h:2820
TeamId m_team
Definition: Player.h:2740
uint32 m_areaUpdateId
Definition: Player.h:2828
uint8 m_specsCount
Definition: Player.h:2780
uint32 m_extraBonusTalentCount
Definition: Player.h:2851
WorldSession * GetSession() const
Definition: Player.h:1974
float m_powerFraction[MAX_POWERS]
Definition: Player.h:2628
uint32 m_oldpetspell
Definition: Player.h:2940
Runes * m_runes
Definition: Player.h:2876
uint32 m_currentBuybackSlot
Definition: Player.h:2753
uint32 m_deathTimer
Definition: Player.h:2830
uint32 m_regenTimerCount
Definition: Player.h:2626
AchievementMgr * m_achievementMgr
Definition: Player.h:2942
uint8 m_swingErrorMsg
Definition: Player.h:2838
time_t m_nextMailDelivereTime
Definition: Player.h:1645
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES > _BgBattlegroundQueueID
Definition: Player.h:2641
void clearResurrectRequestData()
Definition: Player.h:1802
bool m_bPassOnGroupLoot
Definition: Player.h:2862
float m_recallZ
Definition: Player.h:2338
uint32 m_pendingSpectatorForBG
Definition: Player.h:2563
bool m_DailyQuestChanged
Definition: Player.h:2817
uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
Definition: Player.h:2782
Difficulty m_dungeonDifficulty
Definition: Player.h:2746
uint32 m_weaponChangeTimer
Definition: Player.h:2824
uint32 m_WeaponProficiency
Definition: Player.h:2833
float m_realDodge
Definition: Player.h:2620
bool m_canKnockback
Definition: Player.h:2934
bool m_isInstantFlightOn
Definition: Player.h:2959
time_t mSemaphoreTeleport_Near
Definition: Player.h:2927
DeclinedName * m_declinedname
Definition: Player.h:2875
bool m_IsBGRandomWinner
Definition: Player.h:2643
uint32 m_drunkTimer
Definition: Player.h:2823
uint32 m_contestedPvPTimer
Definition: Player.h:2629
float m_homebindY
Definition: Player.h:2348
uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]
Definition: Player.h:1184
uint32 m_baseSpellPower
Definition: Player.h:2788
bool _wasOutdoor
Definition: Player.h:2967
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
Definition: Player.h:2414
uint32 _restFlagMask
Definition: Player.h:2845
uint8 m_grantableLevels
Definition: Player.h:2883
Item * m_items[PLAYER_SLOTS_COUNT]
Definition: Player.h:2752
uint16 m_homebindAreaId
Definition: Player.h:2346
Difficulty m_raidMapDifficulty
Definition: Player.h:2748
uint32 m_zoneUpdateId
Definition: Player.h:2826
bool m_isInWater
Definition: Player.h:2922
uint8 m_MirrorTimerFlagsLast
Definition: Player.h:2921
time_t m_lastDailyQuestTime
Definition: Player.h:2821
time_t m_resetTalentsTime
Definition: Player.h:2848
uint32 m_baseHealthRegen
Definition: Player.h:2791
uint32 m_charmUpdateTimer
Definition: Player.h:2575
uint32 m_summon_mapid
Definition: Player.h:2869
Difficulty m_raidDifficulty
Definition: Player.h:2747
float m_lastFallZ
Definition: Player.h:2917
bool m_summon_asSpectator
Definition: Player.h:2873
uint32 m_baseManaRegen
Definition: Player.h:2790
time_t m_logintime
Definition: Player.h:1182
int32 m_MirrorTimer[MAX_TIMERS]
Definition: Player.h:2919
uint32 _innTriggerId
Definition: Player.h:2843
uint32 m_ArenaTeamIdInvited
Definition: Player.h:2770
uint32 m_recallMap
Definition: Player.h:2335
float m_recallY
Definition: Player.h:2337
uint32 m_questRewardTalentCount
Definition: Player.h:2850
bool m_NeedToSaveGlyphs
Definition: Player.h:2616
uint32 m_HomebindTimer
Definition: Player.h:2411
uint64 m_auraRaidUpdateMask
Definition: Player.h:2861
bool m_canTitanGrip
Definition: Player.h:2837
bool m_canBlock
Definition: Player.h:2836
uint8 m_cinematic
Definition: Player.h:2813
int32 m_spellPenetrationItemMod
Definition: Player.h:2792
uint8 m_activeSpec
Definition: Player.h:2779
WorldSession * m_session
Definition: Player.h:2808
uint32 m_flightSpellActivated
Definition: Player.h:2961
uint32 teleportStore_options
Definition: Player.h:2926
int32 m_baseRatingValue[MAX_COMBAT_RATING]
Definition: Player.h:2787
uint32 m_ArmorProficiency
Definition: Player.h:2834
bool isDebugAreaTriggers
Definition: Player.h:2532
uint32 m_groupUpdateMask
Definition: Player.h:2860
Spell * m_spellModTakingSpell
Definition: Player.h:2528
uint32 m_lastpetnumber
Definition: Player.h:2865
time_t m_Last_tick
Definition: Player.h:1183
PlayerMenu * PlayerTalkClass
Definition: Player.h:2215
uint32 m_GuildIdInvited
Definition: Player.h:2769
float m_homebindX
Definition: Player.h:2347
uint16 m_hostileReferenceCheckTimer
Definition: Player.h:2744
bool m_itemUpdateQueueBlocked
Definition: Player.h:2756
uint32 m_MountBlockId
Definition: Player.h:2618
Definition: Unit.h:630
int32 m_regenTimer
Definition: Unit.h:1871
bool m_ControlledByPlayer
Definition: Unit.h:1705
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1231
bool m_applyResilience
Definition: Unit.h:1884
void Initialize(Unit *defVal)
Definition: UnitUtils.h:51
Definition: ReputationMgr.h:58

References _activeCheats, _BgBattlegroundQueueID, _cinematicMgr, _innTriggerId, _restBonus, _restFlagMask, _restTime, _wasOutdoor, AT_LOGIN_NONE, BASEMOD_END, BATTLEGROUND_QUEUE_NONE, BUYBACK_SLOT_START, CHEAT_NONE, CinematicMgr, clearResurrectRequestData(), CONFIG_INTERVAL_SAVE, DISABLED_MIRROR_TIMER, DUNGEON_DIFFICULTY_NORMAL, FLAT_MOD, GameTime::GetGameTime(), GetSession(), SafeUnitPointer::Initialize(), isDebugAreaTriggers, AccountMgr::IsPlayerAccount(), m_achievementMgr, m_activeSpec, m_additionalSaveMask, m_additionalSaveTimer, m_ammoDPS, Unit::m_applyResilience, m_areaUpdateId, m_ArenaTeamIdInvited, m_ArmorProficiency, m_atLoginFlags, m_auraBaseMod, m_auraRaidUpdateMask, m_baseFeralAP, m_baseHealthRegen, m_baseManaRegen, m_baseRatingValue, m_baseSpellPower, m_bHasDelayedTeleport, m_bMustDelayTeleport, m_bPassOnGroupLoot, m_canBlock, m_canKnockback, m_canParry, m_canTeleport, m_canTitanGrip, m_ChampioningFaction, m_charmAISpells, m_charmUpdateTimer, m_cinematic, m_contestedPvPTimer, Unit::m_ControlledByPlayer, m_creationTime, m_currentBuybackSlot, m_DailyQuestChanged, m_deathExpireTime, m_deathTimer, m_declinedname, m_DelayedOperations, m_drunkTimer, m_dungeonDifficulty, m_extraBonusTalentCount, m_ExtraFlags, m_flightSpellActivated, m_foodEmoteTimerCount, m_forced_speed_changes, m_Glyphs, m_grantableLevels, m_groupUpdateMask, m_GuildIdInvited, m_homebindAreaId, m_homebindMapId, m_HomebindTimer, m_homebindX, m_homebindY, m_homebindZ, m_hostileReferenceCheckTimer, m_ingametime, m_InstanceValid, WorldObject::m_isActive, m_IsBGRandomWinner, m_isInstantFlightOn, m_isInWater, m_items, m_itemUpdateQueueBlocked, m_Last_tick, m_lastDailyQuestTime, m_lastFallTime, m_lastFallZ, m_lastHonorUpdateTime, m_lastpetnumber, m_lastPotionId, m_logintime, m_mailsUpdated, m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, m_MonthlyQuestChanged, m_MountBlockId, Unit::m_movedByPlayer, m_NeedToSaveGlyphs, m_needZoneUpdate, m_nextMailDelivereTime, m_nextSave, Object::m_objectType, Object::m_objectTypeId, m_oldpetspell, m_pendingSpectatorForBG, m_pendingSpectatorInviteInstanceId, m_Played_time, m_powerFraction, m_questRewardTalentCount, m_raidDifficulty, m_raidMapDifficulty, m_realDodge, m_realParry, m_recallMap, m_recallO, m_recallX, m_recallY, m_recallZ, Unit::m_regenTimer, m_regenTimerCount, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_runes, m_SeasonalQuestChanged, m_seer, m_session, m_social, m_specsCount, m_spellModTakingSpell, m_spellPenetrationItemMod, m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, m_swingErrorMsg, m_team, m_temporaryUnsummonedPetNumber, m_trade, m_usedTalentCount, Object::m_valuesCount, m_weaponChangeTimer, m_WeaponProficiency, m_WeeklyQuestChanged, m_zoneUpdateId, m_zoneUpdateTimer, MAX_COMBAT_RATING, MAX_GLYPH_SLOT_INDEX, MAX_MOVE_TYPE, MAX_POWERS, MAX_TALENT_SPECS, MAX_TIMERS, mSemaphoreTeleport_Far, mSemaphoreTeleport_Near, NUM_CAI_SPELLS, PCT_MOD, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_END, PLAYER_MAX_BATTLEGROUND_QUEUES, PLAYER_SLOTS_COUNT, PlayerTalkClass, RAID_DIFFICULTY_10MAN_NORMAL, SetAcceptWhispers(), SetGroupInvite(), SetPendingBind(), sScriptMgr, sWorld, TEAM_NEUTRAL, teleportStore_options, TYPEID_PLAYER, TYPEMASK_PLAYER, UNDERWATER_NONE, and unReadMails.

◆ ~Player()

Player::~Player ( )
override
411{
412 sScriptMgr->OnDestructPlayer(this);
413
414 // it must be unloaded already in PlayerLogout and accessed only for loggined player
415 //m_social = nullptr;
416
417 // Note: buy back item already deleted from DB when player was saved
418 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; ++i)
419 delete m_items[i];
420
421 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
422 delete itr->second;
423
424 for (PlayerTalentMap::const_iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
425 delete itr->second;
426
427 //all mailed items should be deleted, also all mail should be deallocated
428 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
429 {
430 delete *itr;
431 }
432
433 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
434 delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
435
436 delete PlayerTalkClass;
437
438 for (std::size_t x = 0; x < ItemSetEff.size(); x++)
439 delete ItemSetEff[x];
440
441 delete m_declinedname;
442 delete m_runes;
443 delete m_achievementMgr;
444 delete m_reputationMgr;
445 delete _cinematicMgr;
446
447 sWorld->DecreasePlayerCount();
448
449 if (!m_isInSharedVisionOf.empty())
450 {
451 do
452 {
453 Unit* u = *(m_isInSharedVisionOf.begin());
454 u->RemovePlayerFromVision(this);
455 } while (!m_isInSharedVisionOf.empty());
456 }
457}
ItemMap mMitems
Definition: Player.h:1649
PlayerSpellMap m_spells
Definition: Player.h:2773
std::vector< ItemSetEffect * > ItemSetEff
Definition: Player.h:2216
PlayerMails m_mail
Definition: Player.h:2772
PlayerTalentMap m_talents
Definition: Player.h:2774
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2311
void RemovePlayerFromVision(Player *player)
Definition: Unit.cpp:11116

References _cinematicMgr, ItemSetEff, m_achievementMgr, m_declinedname, m_isInSharedVisionOf, m_items, m_mail, m_reputationMgr, m_runes, m_spells, m_talents, mMitems, PLAYER_SLOTS_COUNT, PlayerTalkClass, Unit::RemovePlayerFromVision(), sScriptMgr, and sWorld.

Member Function Documentation

◆ _addSpell()

bool Player::_addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  temporary,
bool  learnFromSkill = false 
)
Todo:
confirm if rogues start wth lockpicking skill at level 1 but only recieve the spell to use it at level 16
3083{
3084 // pussywizard: this can be called to OVERWRITE currently existing spell params! usually to set active = false for lower ranks of a spell
3085
3086 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3087 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, false))
3088 return false;
3089
3090 // pussywizard: already found and temporary, nothing to do
3091 PlayerSpellMap::iterator itr = m_spells.find(spellId);
3092 if (itr != m_spells.end() && itr->second->State == PLAYERSPELL_TEMPORARY)
3093 return false;
3094
3095 // xinef: send packet so client can properly recognize this new spell
3096 // xinef: ignore passive spells and spells with learn effect
3097 // xinef: send spells with no aura effects (ie dual wield)
3098 if (IsInWorld() && !isBeingLoaded() && temporary && !learnFromSkill && (!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3099 SendLearnPacket(spellInfo->Id, true);
3100
3101 // xinef: DO NOT allow to learn spell with effect learn spell!
3102 // xinef: if spell possess spell learn effects only, learn those spells as temporary (eg. Metamorphosis, Tree of Life)
3103 if (temporary && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3104 {
3105 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3106 if (spellInfo->Effects[i].IsEffect())
3107 {
3108 if (spellInfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
3109 {
3110 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN: {}, PLAYER: {}", spellId, GetGUID().ToString());
3111 return false;
3112 //ABORT();
3113 }
3114 else if (SpellInfo const* learnSpell = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
3116 }
3117
3118 return false;
3119 }
3120
3121 if (itr != m_spells.end()) // pussywizard: already know this spell, so update information
3122 {
3123 // pussywizard: do nothing if already set as wanted
3124 if (itr->second->State != PLAYERSPELL_REMOVED && (itr->second->specMask & addSpecMask) == addSpecMask)
3125 return false;
3126
3127 // pussywizard: need cast auras, learn linked spells, do professions stuff, etc.
3128 // pussywizard: but only for spells that are really added (inactive -> active OR added to current spec)
3129 bool spellIsNew = true;
3130
3131 // pussywizard: present in m_spells, not removed, already in current spec, already active
3132 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec))
3133 spellIsNew = false;
3134
3135 // pussywizard: update info in m_spells
3136 if (itr->second->State != PLAYERSPELL_NEW && (itr->second->specMask & addSpecMask) != addSpecMask)
3137 itr->second->State = PLAYERSPELL_CHANGED;
3138 itr->second->Active = true;
3139 itr->second->specMask |= addSpecMask;
3140
3141 if (!spellIsNew)
3142 return true;
3143 }
3144 else // pussywizard: not found in m_spells
3145 {
3146 PlayerSpell* newspell = new PlayerSpell;
3147 newspell->Active = true;
3149 newspell->specMask = addSpecMask;
3150
3151 m_spells[spellId] = newspell;
3152 }
3153
3154 // pussywizard: return if spell not in current spec
3155 // pussywizard: return true to fix active for ranks, this condition is true only at loading, so no problems with learning packets
3156 if (!((1 << GetActiveSpec()) & addSpecMask))
3157 return true;
3158
3159 // xinef: do not add spells with effect learn spell
3160 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3161 {
3162 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN 2: {}, PLAYER: {}", spellId, GetGUID().ToString());
3163 m_spells.erase(spellInfo->Id); // mem leak, but should never happen
3164 return false;
3165 //ABORT();
3166 }
3167 // pussywizard: cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
3168 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3169 {
3170 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3171 CastSpell(this, spellId, true);
3172 }
3173 // pussywizard: cast and return, learnt spells will update profession count, etc.
3174 else if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
3175 {
3176 CastSpell(this, spellId, true);
3177 return false;
3178 }
3179
3180 // xinef: unapply aura stats if dont meet requirements
3181 // xinef: handle only if player is not loaded, loading is handled in loadfromdb
3182 if (!isBeingLoaded())
3183 if (Aura* aura = GetAura(spellId))
3184 {
3185 if (aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_35_PERCENT ||
3186 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTH_ABOVE_75_PERCENT ||
3187 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_20_PERCENT )
3188 if (!HasAuraState((AuraStateType)aura->GetSpellInfo()->CasterAuraState))
3189 aura->HandleAllEffects(aura->GetApplicationOfTarget(GetGUID()), AURA_EFFECT_HANDLE_REAL, false);
3190 }
3191
3192 // pussywizard: update free primary prof points
3193 if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
3194 {
3195 if (spellInfo->IsPrimaryProfessionFirstRank())
3196 SetFreePrimaryProfessions(freeProfs - 1);
3197 }
3198
3199 uint16 maxskill = GetMaxSkillValueForLevel();
3200 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId);
3201 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3202 // xinef: set appropriate skill value
3203 if (spellLearnSkill)
3204 {
3205 uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
3206 uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
3207 uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
3208
3209 if (skill_value < spellLearnSkill->value)
3210 skill_value = spellLearnSkill->value;
3211 if (skill_max_value < new_skill_max_value)
3212 skill_max_value = new_skill_max_value;
3213
3214 SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
3215 }
3216 else
3217 {
3218 // not ranked skills
3219 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3220 {
3221 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3222 if (!pSkill)
3223 {
3224 continue;
3225 }
3226
3228 // Added for runeforging, it is confirmed via sniff that this happens when death knights learn the spell, not on character creation.
3229 if ((_spell_idx->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
3230 {
3231 LearnDefaultSkill(pSkill->id, 0);
3232 }
3233
3234 if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
3235 {
3236 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3237 {
3238 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3239 {
3240 SetHas310Flyer(true);
3241 }
3242 }
3243 }
3244 }
3245 }
3246
3247 // xinef: update achievement criteria
3248 if (!GetSession()->PlayerLoading())
3249 {
3250 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3251 {
3254 }
3256 }
3257
3258 return true;
3259}
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
#define sSpellMgr
Definition: SpellMgr.h:825
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition: SpellMgr.h:584
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
#define SPEC_MASK_ALL
Definition: Player.h:177
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
@ PLAYERSPELL_UNCHANGED
Definition: Player.h:119
@ PLAYERSPELL_CHANGED
Definition: Player.h:120
@ PLAYERSPELL_NEW
Definition: Player.h:121
@ PLAYERSPELL_TEMPORARY
Definition: Player.h:123
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN
Definition: DBCEnums.h:361
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition: DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition: DBCEnums.h:185
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition: DBCEnums.h:218
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1637
@ SPELL_EFFECT_LEARN_SPELL
Definition: SharedDefines.h:814
@ SPELL_EFFECT_SKILL_STEP
Definition: SharedDefines.h:822
SpellAttr0
Definition: SharedDefines.h:381
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
@ SPELL_ATTR0_DO_NOT_DISPLAY
Definition: SharedDefines.h:389
AuraStateType
Definition: SharedDefines.h:1288
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
@ SKILL_RUNEFORGING
Definition: SharedDefines.h:3004
@ SKILL_LOCKPICKING
Definition: SharedDefines.h:2975
@ SKILL_MOUNTS
Definition: SharedDefines.h:3005
#define LOG_INFO(filterType__,...)
Definition: Log.h:164
std::uint16_t uint16
Definition: Define.h:108
bool IsInWorld() const
Definition: Object.h:104
ObjectGuid GetGUID() const
Definition: Object.h:110
std::string ToString() const
Definition: Position.cpp:51
Definition: Player.h:127
PlayerSpellState State
Definition: Player.h:128
bool Active
Definition: Player.h:129
uint8 specMask
Definition: Player.h:130
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2127
bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
Definition: Player.cpp:3082
void learnSpell(uint32 spellId, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3270
void LearnDefaultSkill(uint32 skillId, uint16 rank)
Definition: Player.cpp:11829
bool isBeingLoaded() const override
Definition: PlayerStorage.cpp:4928
void SendLearnPacket(uint32 spellId, bool learn)
Definition: Player.cpp:3018
uint16 GetMaxSkillValueForLevel() const
Definition: Player.cpp:16187
bool IsNeedCastPassiveSpellAtLearn(SpellInfo const *spellInfo) const
Definition: Player.cpp:3261
uint16 GetPureSkillValue(uint32 skill) const
Definition: Player.cpp:5458
bool HasSkill(uint32 skill) const
Definition: Player.cpp:5372
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5428
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
Definition: Player.cpp:5272
bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId=0)
Definition: Player.cpp:3464
uint8 GetActiveSpec() const
Definition: Player.h:1720
void SetHas310Flyer(bool on)
Definition: Player.h:1166
void SetFreePrimaryProfessions(uint16 profs)
Definition: Player.h:1749
uint32 GetFreePrimaryProfessionPoints() const
Definition: Player.h:1748
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5532
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10487
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1154
Definition: SpellAuras.h:87
Definition: SpellInfo.h:316
uint32 Stances
Definition: SpellInfo.h:333
bool IsPassive() const
Definition: SpellInfo.cpp:1097
uint32 Id
Definition: SpellInfo.h:320
bool HasAnyAura() const
Definition: SpellInfo.cpp:900
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
bool IsPrimaryProfessionFirstRank() const
Definition: SpellInfo.cpp:982
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:875
Definition: SpellMgr.h:574
uint16 value
Definition: SpellMgr.h:577
uint16 step
Definition: SpellMgr.h:576
uint16 maxvalue
Definition: SpellMgr.h:578
uint16 skill
Definition: SpellMgr.h:575
static bool CheckSpellValid(SpellInfo const *spellInfo, uint32 spellId, bool isTalent)
Definition: SpellMgr.cpp:460
Definition: DBCStructure.h:1583
uint32 id
Definition: DBCStructure.h:1584

References _addSpell(), ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, PlayerSpell::Active, AURA_EFFECT_HANDLE_REAL, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Unit::CastSpell(), SpellMgr::CheckSpellValid(), SpellInfo::Effects, GetActiveSpec(), Unit::GetAura(), GetFreePrimaryProfessionPoints(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetSession(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), Unit::HasAuraState(), SpellInfo::HasEffect(), HasSkill(), SpellInfo::Id, SkillLineEntry::id, isBeingLoaded(), Object::IsInWorld(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), SpellInfo::IsPrimaryProfessionFirstRank(), LearnDefaultSkill(), learnSpell(), LOG_INFO, m_activeSpec, m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, SendLearnPacket(), SetFreePrimaryProfessions(), SetHas310Flyer(), SetSkill(), SpellLearnSkillNode::skill, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LOCKPICKING, SKILL_MOUNTS, SKILL_RUNEFORGING, SPEC_MASK_ALL, PlayerSpell::specMask, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_SKILL_STEP, sSkillLineStore, sSpellMgr, SpellInfo::Stances, PlayerSpell::State, SpellLearnSkillNode::step, Position::ToString(), UpdateAchievementCriteria(), and SpellLearnSkillNode::value.

Referenced by _addSpell(), _addTalentAurasAndSpells(), addSpell(), AuraEffect::HandleAuraModShapeshift(), and AuraEffect::HandleAuraOverrideSpells().

◆ _AddSpellCooldown()

void Player::_AddSpellCooldown ( uint32  spell_id,
uint16  categoryId,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
11020{
11021 SpellCooldown sc;
11022 sc.end = GameTime::GetGameTimeMS().count() + end_time;
11023 sc.category = categoryId;
11024 sc.itemid = itemid;
11025 sc.maxduration = end_time;
11026 sc.sendToSpectator = false;
11027 sc.needSendToClient = needSendToClient;
11028
11030 {
11031 if (NeedSendSpectatorData() && forceSendToSpectator && (itemid || HasActiveSpell(spellid)))
11032 {
11033 sc.sendToSpectator = true;
11034 ArenaSpectator::SendCommand_Cooldown(FindMap(), GetGUID(), "ACD", spellid, end_time / IN_MILLISECONDS, end_time / IN_MILLISECONDS);
11035 }
11036 }
11037
11038 m_spellCooldowns[spellid] = std::move(sc);
11039}
#define SPECTATOR_COOLDOWN_MAX
Definition: ArenaSpectator.h:37
#define SPECTATOR_COOLDOWN_MIN
Definition: ArenaSpectator.h:36
constexpr auto IN_MILLISECONDS
Definition: Common.h:52
void SendCommand_Cooldown(T *o, ObjectGuid targetGUID, const char *prefix, uint32 id, uint32 dur, uint32 maxdur)
Definition: ArenaSpectator.h:89
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Map * FindMap() const
Definition: Object.h:530
Definition: Player.h:199
uint32 itemid
Definition: Player.h:202
bool sendToSpectator
Definition: Player.h:204
bool needSendToClient
Definition: Player.h:205
uint32 end
Definition: Player.h:200
uint32 maxduration
Definition: Player.h:203
uint16 category
Definition: Player.h:201
bool NeedSendSpectatorData() const
Definition: Player.cpp:15350
bool HasActiveSpell(uint32 spell) const
Definition: Player.cpp:3870
SpellCooldowns m_spellCooldowns
Definition: Player.h:2945

References SpellCooldown::category, SpellCooldown::end, WorldObject::FindMap(), GameTime::GetGameTimeMS(), Object::GetGUID(), HasActiveSpell(), IN_MILLISECONDS, SpellCooldown::itemid, m_spellCooldowns, SpellCooldown::maxduration, NeedSendSpectatorData(), SpellCooldown::needSendToClient, ArenaSpectator::SendCommand_Cooldown(), SpellCooldown::sendToSpectator, SPECTATOR_COOLDOWN_MAX, and SPECTATOR_COOLDOWN_MIN.

Referenced by _LoadSpellCooldowns(), AddSpellAndCategoryCooldowns(), and AddSpellCooldown().

◆ _addTalentAurasAndSpells()

void Player::_addTalentAurasAndSpells ( uint32  spellId)
3002{
3003 // pussywizard: spells learnt from talents are added as TEMPORARY, so not saved to db (only the talent itself is saved)
3004 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3005 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3006 {
3007 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3008 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3009 _addSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3010 }
3011 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3012 {
3013 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3014 CastSpell(this, spellId, true);
3015 }
3016}

References _addSpell(), Unit::CastSpell(), SpellInfo::Effects, SpellInfo::HasAttribute(), SpellInfo::HasEffect(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), MAX_SPELL_EFFECTS, SPEC_MASK_ALL, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, and SpellInfo::Stances.

Referenced by ActivateSpec(), and addTalent().

◆ _ApplyAllItemMods()

void Player::_ApplyAllItemMods ( )
7519{
7520 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods start.");
7521
7522 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7523 {
7524 if (m_items[i])
7525 {
7526 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7527 continue;
7528
7529 ItemTemplate const* proto = m_items[i]->GetTemplate();
7530 if (!proto)
7531 continue;
7532
7533 uint32 attacktype = Player::GetAttackBySlot(i);
7534 if (attacktype < MAX_ATTACK)
7536
7537 _ApplyItemBonuses(proto, i, true);
7538
7539 if (i == EQUIPMENT_SLOT_RANGED)
7541 }
7542 }
7543
7544 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7545 {
7546 if (m_items[i])
7547 {
7548 ItemTemplate const* proto = m_items[i]->GetTemplate();
7549 if (!proto)
7550 continue;
7551
7552 // item set bonuses not dependent from item broken state
7553 if (proto->ItemSet)
7554 AddItemsSetItem(this, m_items[i]);
7555
7556 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7557 continue;
7558
7559 ApplyItemEquipSpell(m_items[i], true);
7560 ApplyEnchantment(m_items[i], true);
7561 }
7562 }
7563
7564 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods complete.");
7565}
void AddItemsSetItem(Player *player, Item *item)
Definition: Item.cpp:33
@ INVENTORY_SLOT_BAG_END
Definition: Player.h:700
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:692
WeaponAttackType
Definition: Unit.h:208
@ MAX_ATTACK
Definition: Unit.h:212
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:168
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:545
Definition: ItemTemplate.h:619
uint32 ItemSet
Definition: ItemTemplate.h:675
void _ApplyAmmoBonuses()
Definition: Player.cpp:7585
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7052
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
Definition: PlayerStorage.cpp:4319
void _ApplyItemBonuses(ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
Definition: Player.cpp:6548
void _ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackType, bool apply)
Definition: Player.cpp:6948
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:565
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:952

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), AddItemsSetItem(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, and MAX_ATTACK.

Referenced by _ApplyAllStatBonuses(), and _LoadInventory().

◆ _ApplyAllLevelScaleItemMods()

void Player::_ApplyAllLevelScaleItemMods ( bool  apply)
7568{
7569 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7570 {
7571 if (m_items[i])
7572 {
7573 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7574 continue;
7575
7576 ItemTemplate const* proto = m_items[i]->GetTemplate();
7577 if (!proto)
7578 continue;
7579
7580 _ApplyItemMods(m_items[i], i, apply);
7581 }
7582 }
7583}
void _ApplyItemMods(Item *item, uint8 slot, bool apply)
Definition: Player.cpp:6513

References _ApplyItemMods(), Unit::CanUseAttackType(), GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, and m_items.

Referenced by GiveLevel(), and reset_commandscript::HandleResetLevelCommand().

◆ _ApplyAllStatBonuses()

void Player::_ApplyAllStatBonuses ( )
980{
981 SetCanModifyStats(false);
982
985
986 SetCanModifyStats(true);
987
989}
void _ApplyAllItemMods()
Definition: Player.cpp:7518
bool UpdateAllStats() override
Definition: StatSystem.cpp:188
void _ApplyAllAuraStatMods()
Definition: Unit.cpp:5439
void SetCanModifyStats(bool modifyStats)
Definition: Unit.h:1449

References Unit::_ApplyAllAuraStatMods(), _ApplyAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _ApplyAmmoBonuses()

void Player::_ApplyAmmoBonuses ( )
7586{
7587 // check ammo
7589 if (!ammo_id)
7590 return;
7591
7592 float currentAmmoDPS;
7593
7594 ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id);
7595 if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto))
7596 currentAmmoDPS = 0.0f;
7597 else
7598 currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2;
7599
7600 sScriptMgr->OnApplyAmmoBonuses(this, ammo_proto, currentAmmoDPS);
7601
7602 if (currentAmmoDPS == GetAmmoDPS())
7603 return;
7604
7605 m_ammoDPS = currentAmmoDPS;
7606
7607 if (CanModifyStats())
7609}
#define sObjectMgr
Definition: ObjectMgr.h:1623
@ PLAYER_AMMO_ID
Definition: UpdateFields.h:369
@ ITEM_CLASS_PROJECTILE
Definition: ItemTemplate.h:297
@ RANGED_ATTACK
Definition: Unit.h:211
float DamageMin
Definition: ItemTemplate.h:579
float DamageMax
Definition: ItemTemplate.h:580
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]
Definition: ItemTemplate.h:651
uint32 Class
Definition: ItemTemplate.h:621
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305
bool CheckAmmoCompatibility(ItemTemplate const *ammo_proto) const
Definition: Player.cpp:7611
float GetAmmoDPS() const
Definition: Player.h:1319
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
bool CanModifyStats() const
Definition: Unit.h:1448

References Unit::CanModifyStats(), CheckAmmoCompatibility(), ItemTemplate::Class, ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, GetAmmoDPS(), Object::GetUInt32Value(), ITEM_CLASS_PROJECTILE, m_ammoDPS, PLAYER_AMMO_ID, RANGED_ATTACK, sObjectMgr, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and SetAmmo().

◆ _ApplyItemBonuses()

void Player::_ApplyItemBonuses ( ItemTemplate const *  proto,
uint8  slot,
bool  apply,
bool  only_level_scale = false 
)
Deprecated:
item mods
6549{
6550 if (slot >= INVENTORY_SLOT_BAG_END || !proto)
6551 return;
6552
6553 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6554 if (only_level_scale && !ssd)
6555 return;
6556
6557 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6558 uint32 ssd_level = GetLevel();
6559 uint32 CustomScalingStatValue = 0;
6560
6561 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6562
6563 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6564
6565 if (ssd && ssd_level > ssd->MaxLevel)
6566 ssd_level = ssd->MaxLevel;
6567
6568 ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6569 if (only_level_scale && !ssv)
6570 return;
6571
6572 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
6573 {
6574 uint32 statType = 0;
6575 int32 val = 0;
6576 // If set ScalingStatDistribution need get stats and values from it
6577 if (ssv)
6578 {
6579 if (ssd)
6580 {
6581 if (ssd->StatMod[i] < 0)
6582 continue;
6583
6584 statType = ssd->StatMod[i];
6585 val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
6586 }
6587 else
6588 {
6589 if (i >= proto->StatsCount)
6590 continue;
6591
6592 // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
6593 sScriptMgr->OnCustomScalingStatValue(this, proto, statType, val, i, ScalingStatValue, ssv);
6594 }
6595 }
6596 else
6597 {
6598 if (i >= proto->StatsCount)
6599 continue;
6600
6601 statType = proto->ItemStat[i].ItemStatType;
6602 val = proto->ItemStat[i].ItemStatValue;
6603
6604 sScriptMgr->OnApplyItemModsBefore(this, slot, apply, i, statType, val);
6605 }
6606
6607 if (val == 0)
6608 continue;
6609
6610 switch (statType)
6611 {
6612 case ITEM_MOD_MANA:
6613 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
6614 break;
6615 case ITEM_MOD_HEALTH: // modify HP
6616 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
6617 break;
6618 case ITEM_MOD_AGILITY: // modify agility
6620 ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
6621 break;
6622 case ITEM_MOD_STRENGTH: //modify strength
6624 ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
6625 break;
6626 case ITEM_MOD_INTELLECT: //modify intellect
6628 ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
6629 break;
6630 case ITEM_MOD_SPIRIT: //modify spirit
6632 ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
6633 break;
6634 case ITEM_MOD_STAMINA: //modify stamina
6636 ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
6637 break;
6640 break;
6642 ApplyRatingMod(CR_DODGE, int32(val), apply);
6643 break;
6645 ApplyRatingMod(CR_PARRY, int32(val), apply);
6646 break;
6648 ApplyRatingMod(CR_BLOCK, int32(val), apply);
6649 break;
6651 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6652 break;
6654 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6655 break;
6657 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6658 break;
6660 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6661 break;
6663 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6664 break;
6666 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6667 break;
6670 break;
6673 break;
6676 break;
6679 break;
6682 break;
6685 break;
6687 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6688 break;
6690 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6691 break;
6693 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6694 break;
6696 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6697 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6698 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6699 break;
6701 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6702 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6703 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6704 break;
6709 break;
6715 break;
6717 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6718 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6719 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6720 break;
6722 ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
6723 break;
6727 break;
6730 break;
6731 // case ITEM_MOD_FERAL_ATTACK_POWER:
6732 // ApplyFeralAPBonus(int32(val), apply);
6733 // break;
6735 ApplyManaRegenBonus(int32(val), apply);
6736 break;
6739 break;
6741 ApplySpellPowerBonus(int32(val), apply);
6742 break;
6744 ApplyHealthRegenBonus(int32(val), apply);
6745 break;
6747 ApplySpellPenetrationBonus(val, apply);
6748 break;
6750 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
6751 break;
6755 break;
6756 }
6757 }
6758
6759 // Apply Spell Power from ScalingStatValue if set
6760 if (ssv)
6761 if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
6762 ApplySpellPowerBonus(spellbonus, apply);
6763
6764 // If set ScalingStatValue armor get it or use item armor
6765 uint32 armor = proto->Armor;
6766 if (ssv)
6767 {
6768 if (uint32 ssvarmor = ssv->getArmorMod(ScalingStatValue))
6769 if (proto->ScalingStatValue > 0 || ssvarmor < proto->Armor) //Check to avoid higher values than stat itself (heirloom OR items with correct armor value)
6770 armor = ssvarmor;
6771 }
6772 else if (armor && proto->ArmorDamageModifier)
6773 armor -= uint32(proto->ArmorDamageModifier);
6774
6775 if (armor)
6776 {
6777 UnitModifierType modType = TOTAL_VALUE;
6778 if (proto->Class == ITEM_CLASS_ARMOR)
6779 {
6780 switch (proto->SubClass)
6781 {
6787 modType = BASE_VALUE;
6788 break;
6789 }
6790 }
6791 HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
6792 }
6793
6794 // Add armor bonus from ArmorDamageModifier if > 0
6795 if (proto->ArmorDamageModifier > 0 && sScriptMgr->CanArmorDamageModifier(this))
6796 HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(proto->ArmorDamageModifier), apply);
6797
6798 if (proto->Block)
6799 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
6800
6801 if (proto->HolyRes)
6802 HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
6803
6804 if (proto->FireRes)
6805 HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
6806
6807 if (proto->NatureRes)
6808 HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
6809
6810 if (proto->FrostRes)
6811 HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
6812
6813 if (proto->ShadowRes)
6814 HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
6815
6816 if (proto->ArcaneRes)
6817 HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
6818
6819 uint8 attType = Player::GetAttackBySlot(slot);
6820 if (attType != MAX_ATTACK)
6821 {
6822 _ApplyWeaponDamage(slot, proto, ssv, apply);
6823 }
6824
6825 // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
6827 {
6828 int32 dpsMod = 0;
6829 int32 feral_bonus = 0;
6830 if (ssv)
6831 {
6832 dpsMod = ssv->getDPSMod(ScalingStatValue);
6833 feral_bonus += ssv->getFeralBonus(ScalingStatValue);
6834 }
6835
6836 feral_bonus += proto->getFeralBonus(dpsMod);
6837 sScriptMgr->OnGetFeralApBonus(this, feral_bonus, dpsMod, proto, ssv);
6838 if (feral_bonus)
6839 ApplyFeralAPBonus(feral_bonus, apply);
6840 }
6841}
DBCStorage< ScalingStatDistributionEntry > sScalingStatDistributionStore(ScalingStatDistributionfmt)
DBCStorage< ScalingStatValuesEntry > sScalingStatValuesStore(ScalingStatValuesfmt)
@ ITEM_MOD_CRIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:48
@ ITEM_MOD_HIT_MELEE_RATING
Definition: ItemTemplate.h:38
@ ITEM_MOD_HIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:44
@ ITEM_MOD_STAMINA
Definition: ItemTemplate.h:33
@ ITEM_MOD_HIT_SPELL_RATING
Definition: ItemTemplate.h:40
@ ITEM_MOD_SPELL_PENETRATION
Definition: ItemTemplate.h:69
@ ITEM_MOD_PARRY_RATING
Definition: ItemTemplate.h:36
@ ITEM_MOD_DEFENSE_SKILL_RATING
Definition: ItemTemplate.h:34
@ ITEM_MOD_HASTE_RANGED_RATING
Definition: ItemTemplate.h:51
@ ITEM_MOD_CRIT_TAKEN_RATING
Definition: ItemTemplate.h:56
@ ITEM_MOD_EXPERTISE_RATING
Definition: ItemTemplate.h:59
@ ITEM_MOD_MANA
Definition: ItemTemplate.h:27
@ ITEM_MOD_RANGED_ATTACK_POWER
Definition: ItemTemplate.h:61
@ ITEM_MOD_HEALTH
Definition: ItemTemplate.h:28
@ ITEM_MOD_CRIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:49
@ ITEM_MOD_HIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:46
@ ITEM_MOD_SPIRIT
Definition: ItemTemplate.h:32
@ ITEM_MOD_SPELL_POWER
Definition: ItemTemplate.h:67
@ ITEM_MOD_HASTE_SPELL_RATING
Definition: ItemTemplate.h:52
@ ITEM_MOD_ATTACK_POWER
Definition: ItemTemplate.h:60
@ ITEM_MOD_HASTE_RATING
Definition: ItemTemplate.h:58
@ ITEM_MOD_HIT_RANGED_RATING
Definition: ItemTemplate.h:39
@ ITEM_MOD_CRIT_SPELL_RATING
Definition: ItemTemplate.h:43
@ ITEM_MOD_BLOCK_VALUE
Definition: ItemTemplate.h:70
@ ITEM_MOD_CRIT_RANGED_RATING
Definition: ItemTemplate.h:42
@ ITEM_MOD_CRIT_MELEE_RATING
Definition: ItemTemplate.h:41
@ ITEM_MOD_STRENGTH
Definition: ItemTemplate.h:30
@ ITEM_MOD_HEALTH_REGEN
Definition: ItemTemplate.h:68
@ ITEM_MOD_BLOCK_RATING
Definition: ItemTemplate.h:37
@ ITEM_MOD_ARMOR_PENETRATION_RATING
Definition: ItemTemplate.h:66
@ ITEM_MOD_SPELL_HEALING_DONE
Definition: ItemTemplate.h:63
@ ITEM_MOD_CRIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:47
@ ITEM_MOD_HIT_TAKEN_RATING
Definition: ItemTemplate.h:55
@ ITEM_MOD_HASTE_MELEE_RATING
Definition: ItemTemplate.h:50
@ ITEM_MOD_MANA_REGENERATION
Definition: ItemTemplate.h:65
@ ITEM_MOD_HIT_RATING
Definition: ItemTemplate.h:53
@ ITEM_MOD_INTELLECT
Definition: ItemTemplate.h:31
@ ITEM_MOD_RESILIENCE_RATING
Definition: ItemTemplate.h:57
@ ITEM_MOD_AGILITY
Definition: ItemTemplate.h:29
@ ITEM_MOD_DODGE_RATING
Definition: ItemTemplate.h:35
@ ITEM_MOD_CRIT_RATING
Definition: ItemTemplate.h:54
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition: ItemTemplate.h:64
@ ITEM_MOD_HIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:45
@ ITEM_SUBCLASS_ARMOR_MAIL
Definition: ItemTemplate.h:393
@ ITEM_SUBCLASS_ARMOR_CLOTH
Definition: ItemTemplate.h:391
@ ITEM_SUBCLASS_ARMOR_LEATHER
Definition: ItemTemplate.h:392
@ ITEM_SUBCLASS_ARMOR_SHIELD
Definition: ItemTemplate.h:396
@ ITEM_SUBCLASS_ARMOR_PLATE
Definition: ItemTemplate.h:394
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:295
#define MAX_ITEM_PROTO_STATS
Definition: ItemTemplate.h:616
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:147
@ UNIT_MOD_ARMOR
Definition: Unit.h:156
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:160
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:163
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:162
@ UNIT_MOD_HEALTH
Definition: Unit.h:148
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:158
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:143
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:159
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:144
@ UNIT_MOD_MANA
Definition: Unit.h:149
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:145
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:164
@ SHIELD_BLOCK_VALUE
Definition: Unit.h:183
UnitModifierType
Definition: Unit.h:125
@ BASE_VALUE
Definition: Unit.h:126
@ TOTAL_VALUE
Definition: Unit.h:128
@ CR_EXPERTISE
Definition: Unit.h:240
@ CR_HIT_TAKEN_MELEE
Definition: Unit.h:228
@ CR_HASTE_RANGED
Definition: Unit.h:235
@ CR_HIT_MELEE
Definition: Unit.h:222
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:233
@ CR_ARMOR_PENETRATION
Definition: Unit.h:241
@ CR_CRIT_MELEE
Definition: Unit.h:225
@ CR_CRIT_RANGED
Definition: Unit.h:226
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:230
@ CR_PARRY
Definition: Unit.h:220
@ CR_DODGE
Definition: Unit.h:219
@ CR_DEFENSE_SKILL
Definition: Unit.h:218
@ CR_HASTE_MELEE
Definition: Unit.h:234
@ CR_BLOCK
Definition: Unit.h:221
@ CR_HASTE_SPELL
Definition: Unit.h:236
@ CR_HIT_SPELL
Definition: Unit.h:224
@ CR_HIT_TAKEN_RANGED
Definition: Unit.h:229
@ CR_CRIT_SPELL
Definition: Unit.h:227
@ CR_HIT_RANGED
Definition: Unit.h:223
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:231
@ CLASS_CONTEXT_STATS
Definition: UnitDefines.h:209
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260
std::int32_t int32
Definition: Define.h:103
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition: Player.cpp:5202
void ApplySpellPenetrationBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:219
void _ApplyWeaponDamage(uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
Definition: Player.cpp:6843
void ApplyManaRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:913
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1279
void ApplySpellPowerBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:167
void ApplyFeralAPBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:324
void ApplyHealthRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:919
void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
Definition: Player.cpp:4961
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition: Unit.h:1377
bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
Definition: Unit.cpp:15130
uint8 GetLevel() const
Definition: Unit.h:759
Definition: DBCStructure.h:1473
uint32 MaxLevel
Definition: DBCStructure.h:1477
uint32 Modifier[10]
Definition: DBCStructure.h:1476
int32 StatMod[10]
Definition: DBCStructure.h:1475
Definition: DBCStructure.h:1481
uint32 getArmorMod(uint32 mask) const
Definition: DBCStructure.h:1506
uint32 getDPSMod(uint32 mask) const
Definition: DBCStructure.h:1524
uint32 getFeralBonus(uint32 mask) const
Definition: DBCStructure.h:1554
uint32 getssdMultiplier(uint32 mask) const
Definition: DBCStructure.h:1492
uint32 getSpellBonus(uint32 mask) const
Definition: DBCStructure.h:1548

References _ApplyWeaponDamage(), ApplyFeralAPBonus(), ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), ItemTemplate::ArcaneRes, ItemTemplate::Armor, ItemTemplate::ArmorDamageModifier, BASE_VALUE, ItemTemplate::Block, ItemTemplate::Class, CLASS_CONTEXT_STATS, CLASS_DRUID, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, ItemTemplate::FireRes, FLAT_MOD, ItemTemplate::FrostRes, ScalingStatValuesEntry::getArmorMod(), GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), ItemTemplate::getFeralBonus(), ScalingStatValuesEntry::getFeralBonus(), Unit::GetLevel(), ScalingStatValuesEntry::getSpellBonus(), ScalingStatValuesEntry::getssdMultiplier(), HandleBaseModValue(), Unit::HandleStatModifier(), ItemTemplate::HolyRes, INVENTORY_SLOT_BAG_END, IsClass(), ITEM_CLASS_ARMOR, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_CRIT_TAKEN_MELEE_RATING, ITEM_MOD_CRIT_TAKEN_RANGED_RATING, ITEM_MOD_CRIT_TAKEN_RATING, ITEM_MOD_CRIT_TAKEN_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_MELEE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_HIT_TAKEN_MELEE_RATING, ITEM_MOD_HIT_TAKEN_RANGED_RATING, ITEM_MOD_HIT_TAKEN_RATING, ITEM_MOD_HIT_TAKEN_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, MAX_ATTACK, MAX_ITEM_PROTO_STATS, ScalingStatDistributionEntry::MaxLevel, ScalingStatDistributionEntry::Modifier, ItemTemplate::NatureRes, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, ItemTemplate::ShadowRes, SHIELD_BLOCK_VALUE, sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, ScalingStatDistributionEntry::StatMod, ItemTemplate::StatsCount, ItemTemplate::SubClass, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), and _RemoveAllItemMods().

◆ _ApplyItemMods()

void Player::_ApplyItemMods ( Item item,
uint8  slot,
bool  apply 
)
6514{
6515 if (slot >= INVENTORY_SLOT_BAG_END || !item)
6516 return;
6517
6518 ItemTemplate const* proto = item->GetTemplate();
6519
6520 if (!proto)
6521 return;
6522
6523 // not apply/remove mods for broken item
6524 if (item->IsBroken())
6525 return;
6526
6527 LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString());
6528
6529 uint8 attacktype = Player::GetAttackBySlot(slot);
6530
6531 if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items
6532 CorrectMetaGemEnchants(slot, apply);
6533
6534 if (attacktype < MAX_ATTACK)
6535 _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply);
6536
6537 _ApplyItemBonuses(proto, slot, apply);
6538
6539 if (slot == EQUIPMENT_SLOT_RANGED)
6541
6542 ApplyItemEquipSpell(item, apply);
6543 ApplyEnchantment(item, apply);
6544
6545 LOG_DEBUG("entities.player.items", "_ApplyItemMods complete.");
6546}
bool HasSocket() const
Definition: Item.cpp:1008
bool IsBroken() const
Definition: Item.h:257
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:109
std::string ToString() const
Definition: ObjectGuid.cpp:47
void CorrectMetaGemEnchants(uint8 slot, bool apply)
Definition: Player.cpp:11162

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), CorrectMetaGemEnchants(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Object::GetGUID(), Item::GetTemplate(), Item::HasSocket(), INVENTORY_SLOT_BAG_END, Item::IsBroken(), LOG_DEBUG, MAX_ATTACK, and ObjectGuid::ToString().

Referenced by _ApplyAllLevelScaleItemMods(), DestroyItem(), DurabilityPointsLoss(), DurabilityRepair(), EquipItem(), and RemoveItem().

◆ _ApplyWeaponDamage()

void Player::_ApplyWeaponDamage ( uint8  slot,
ItemTemplate const *  proto,
ScalingStatValuesEntry const *  ssv,
bool  apply 
)
6844{
6845 uint32 CustomScalingStatValue = 0;
6846
6847 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6848
6849 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6850
6851 // following part fix disarm issue
6852 // that doesn't apply the scaling after disarmed
6853 if (!ssv)
6854 {
6855 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6856
6857 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6858 uint32 ssd_level = GetLevel();
6859
6860 if (ssd && ssd_level > ssd->MaxLevel)
6861 ssd_level = ssd->MaxLevel;
6862
6863 ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6864 }
6865
6866 uint8 attType = Player::GetAttackBySlot(slot);
6867 if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
6868 {
6869 return;
6870 }
6871
6872 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6873 {
6874 float minDamage = proto->Damage[i].DamageMin;
6875 float maxDamage = proto->Damage[i].DamageMax;
6876
6877 // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
6878 if (ssv)
6879 {
6880 int32 extraDPS = ssv->getDPSMod(ScalingStatValue);
6881 if (extraDPS)
6882 {
6883 float average = extraDPS * proto->Delay / 1000.0f;
6884 float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;
6885
6886 minDamage = (1.0f - mod) * average;
6887 maxDamage = (1.0f + mod) * average;
6888 }
6889 }
6890
6891 if (apply)
6892 {
6893 if (minDamage > 0.f)
6894 {
6895 SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i);
6896 }
6897
6898 if (maxDamage > 0.f)
6899 {
6900 SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i);
6901 }
6902 }
6903 }
6904
6905 if (!apply)
6906 {
6907 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6908 {
6911 }
6912
6913 if (attType == BASE_ATTACK)
6914 {
6917 }
6918 }
6919
6920 if (proto->Delay && !IsInFeralForm())
6921 {
6922 if (slot == EQUIPMENT_SLOT_RANGED)
6923 SetAttackTime(RANGED_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6924 else if (slot == EQUIPMENT_SLOT_MAINHAND)
6925 SetAttackTime(BASE_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6926 else if (slot == EQUIPMENT_SLOT_OFFHAND)
6927 SetAttackTime(OFF_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6928 }
6929
6930 // No need to modify any physical damage for ferals as it is calculated from stats only
6931 if (IsInFeralForm())
6932 return;
6933
6934 if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay))
6936}
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:690
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:691
@ MINDAMAGE
Definition: Unit.h:135
@ MAXDAMAGE
Definition: Unit.h:136
#define BASE_ATTACK_TIME
Definition: Unit.h:41
@ OFF_ATTACK
Definition: Unit.h:210
@ BASE_ATTACK
Definition: Unit.h:209
#define BASE_MAXDAMAGE
Definition: Unit.h:40
#define BASE_MINDAMAGE
Definition: Unit.h:39
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
Definition: Unit.cpp:15379
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
Definition: Unit.h:1461
bool IsInFeralForm() const
Definition: Unit.h:1420
void SetAttackTime(WeaponAttackType att, uint32 val)
Definition: Unit.h:818

References BASE_ATTACK, BASE_ATTACK_TIME, BASE_MAXDAMAGE, BASE_MINDAMAGE, Unit::CanModifyStats(), Unit::CanUseAttackType(), ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, ItemTemplate::Delay, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), Unit::GetLevel(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), ScalingStatValuesEntry::IsTwoHand(), MAX_ITEM_PROTO_DAMAGES, MAXDAMAGE, ScalingStatDistributionEntry::MaxLevel, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, Unit::SetAttackTime(), Unit::SetBaseWeaponDamage(), sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyItemBonuses(), AuraEffect::HandleAuraModDisarm(), and AuraEffect::HandleAuraModShapeshift().

◆ _ApplyWeaponDependentAuraCritMod()

void Player::_ApplyWeaponDependentAuraCritMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
6964{
6965 // don't apply mod if item is broken or cannot be used
6966 if (item->IsBroken() || !CanUseAttackType(attackType))
6967 return;
6968
6969 // generic not weapon specific case processes in aura code
6970 if (aura->GetSpellInfo()->EquippedItemClass == -1)
6971 return;
6972
6973 if (!sScriptMgr->CanApplyWeaponDependentAuraDamageMod(this, item, attackType, aura, apply))
6974 return;
6975
6977 switch (attackType)
6978 {
6979 case BASE_ATTACK:
6980 mod = CRIT_PERCENTAGE;
6981 break;
6982 case OFF_ATTACK:
6984 break;
6985 case RANGED_ATTACK:
6987 break;
6988 default:
6989 return;
6990 }
6991
6992 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
6993 HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply);
6994}
BaseModGroup
Definition: Unit.h:179
@ OFFHAND_CRIT_PERCENTAGE
Definition: Unit.h:182
@ CRIT_PERCENTAGE
Definition: Unit.h:180
@ RANGED_CRIT_PERCENTAGE
Definition: Unit.h:181
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition: Item.cpp:885

References BASE_ATTACK, BASEMOD_END, Unit::CanUseAttackType(), CRIT_PERCENTAGE, SpellInfo::EquippedItemClass, FLAT_MOD, AuraEffect::GetAmount(), AuraEffect::GetSpellInfo(), HandleBaseModValue(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, and sScriptMgr.

Referenced by _ApplyWeaponDependentAuraMods(), and AuraEffect::HandleAuraModWeaponCritPercent().

◆ _ApplyWeaponDependentAuraDamageMod()

void Player::_ApplyWeaponDependentAuraDamageMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
6997{
6998 // don't apply mod if item is broken or cannot be used
6999 if (item->IsBroken() || !CanUseAttackType(attackType))
7000 return;
7001
7002 // ignore spell mods for not wands
7003 if ((aura->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) == 0 && (getClassMask() & CLASSMASK_WAND_USERS) == 0)
7004 return;
7005
7006 // generic not weapon specific case processes in aura code
7007 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7008 return;
7009
7010 UnitMods unitMod = UNIT_MOD_END;
7011 switch (attackType)
7012 {
7013 case BASE_ATTACK:
7014 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
7015 break;
7016 case OFF_ATTACK:
7017 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
7018 break;
7019 case RANGED_ATTACK:
7020 unitMod = UNIT_MOD_DAMAGE_RANGED;
7021 break;
7022 default:
7023 return;
7024 }
7025
7026 UnitModifierType unitModType = TOTAL_VALUE;
7027 switch (aura->GetAuraType())
7028 {
7030 unitModType = TOTAL_VALUE;
7031 break;
7033 unitModType = TOTAL_PCT;
7034 break;
7035 default:
7036 return;
7037 }
7038
7039 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7040 {
7041 HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
7042 if (unitModType == TOTAL_VALUE)
7043 {
7044 if (aura->GetAmount() > 0)
7045 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
7046 else
7047 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply);
7048 }
7049 }
7050}
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
Definition: UpdateFields.h:360
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
Definition: UpdateFields.h:361
UnitMods
Definition: Unit.h:142
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:166
@ UNIT_MOD_END
Definition: Unit.h:168
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:165
@ TOTAL_PCT
Definition: Unit.h:129
#define CLASSMASK_WAND_USERS
Definition: SharedDefines.h:174
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:806
uint32 getClassMask() const
Definition: Unit.h:767

References Object::ApplyModUInt32Value(), BASE_ATTACK, Unit::CanUseAttackType(), CLASSMASK_WAND_USERS, SpellInfo::EquippedItemClass, AuraEffect::GetAmount(), AuraEffect::GetAuraType(), Unit::getClassMask(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), Unit::HandleStatModifier(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, RANGED_ATTACK, SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, and UNIT_MOD_END.

Referenced by _ApplyWeaponDependentAuraMods(), AuraEffect::HandleModDamageDone(), and AuraEffect::HandleModDamagePercentDone().

◆ _ApplyWeaponDependentAuraMods()

void Player::_ApplyWeaponDependentAuraMods ( Item item,
WeaponAttackType  attackType,
bool  apply 
)
6949{
6951 for (AuraEffectList::const_iterator itr = auraCritList.begin(); itr != auraCritList.end(); ++itr)
6952 _ApplyWeaponDependentAuraCritMod(item, attackType, *itr, apply);
6953
6955 for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
6956 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
6957
6959 for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
6960 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
6961}
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
void _ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:6996
void _ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:6963
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1310
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:646

References _ApplyWeaponDependentAuraCritMod(), _ApplyWeaponDependentAuraDamageMod(), Unit::GetAuraEffectsByType(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and AuraEffect::HandleAuraModDisarm().

◆ _LoadActions()

void Player::_LoadActions ( PreparedQueryResult  result)
protected
5689{
5690 m_actionButtons.clear();
5691
5692 if (result)
5693 {
5694 do
5695 {
5696 Field* fields = result->Fetch();
5697 uint8 button = fields[0].Get<uint8>();
5698 uint32 action = fields[1].Get<uint32>();
5699 uint8 type = fields[2].Get<uint8>();
5700
5701 if (ActionButton* ab = addActionButton(button, action, type))
5702 ab->uState = ACTIONBUTTON_UNCHANGED;
5703 else
5704 {
5705 LOG_ERROR("entities.player", "ActionButton loading problem, will be deleted from db...");
5706
5707 // Will deleted in DB at next save (it can create data until save but marked as deleted)
5708 m_actionButtons[button].uState = ACTIONBUTTON_DELETED;
5709 }
5710 } while (result->NextRow());
5711 }
5712}
@ ACTIONBUTTON_UNCHANGED
Definition: Player.h:221
@ ACTIONBUTTON_DELETED
Definition: Player.h:224
#define LOG_ERROR(filterType__,...)
Definition: Log.h:156
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
Definition: Player.h:253
ActionButton * addActionButton(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5565
ActionButtonList m_actionButtons
Definition: Player.h:2784

References ACTIONBUTTON_DELETED, ACTIONBUTTON_UNCHANGED, addActionButton(), Field::Get(), LOG_ERROR, and m_actionButtons.

Referenced by WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and LoadFromDB().

◆ _LoadArenaTeamInfo()

void Player::_LoadArenaTeamInfo ( )
protected
4812{
4814
4815 for (auto const& itr : ArenaTeam::ArenaSlotByType)
4816 if (uint32 arenaTeamId = sCharacterCache->GetCharacterArenaTeamIdByGuid(GetGUID(), itr.second))
4817 {
4818 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
4819 if (!arenaTeam)
4820 {
4821 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No arena team was found.");
4822 continue;
4823 }
4824 ArenaTeamMember const* member = arenaTeam->GetMember(GetGUID());
4825 if (!member)
4826 {
4827 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No members in the arena team ({}) was found.", arenaTeamId);
4828 continue;
4829 }
4830 uint8 slot = itr.second;
4831
4832 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, arenaTeamId);
4833 SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, arenaTeam->GetType());
4834 SetArenaTeamInfoField(slot, ARENA_TEAM_MEMBER, (arenaTeam->GetCaptain() == GetGUID()) ? 0 : 1);
4839 }
4840}
#define sCharacterCache
Definition: CharacterCache.h:83
#define MAX_ARENA_SLOT
Definition: ArenaTeam.h:135
@ ARENA_TEAM_GAMES_WEEK
Definition: ArenaTeam.h:78
@ ARENA_TEAM_TYPE
Definition: ArenaTeam.h:76
@ ARENA_TEAM_ID
Definition: ArenaTeam.h:75
@ ARENA_TEAM_END
Definition: ArenaTeam.h:82
@ ARENA_TEAM_PERSONAL_RATING
Definition: ArenaTeam.h:81
@ ARENA_TEAM_MEMBER
Definition: ArenaTeam.h:77
@ ARENA_TEAM_WINS_SEASON
Definition: ArenaTeam.h:80
@ ARENA_TEAM_GAMES_SEASON
Definition: ArenaTeam.h:79
#define sArenaTeamMgr
Definition: ArenaTeamMgr.h:67
@ PLAYER_FIELD_ARENA_TEAM_INFO_1_1
Definition: UpdateFields.h:381
Definition: ArenaTeam.h:109
uint16 PersonalRating
Definition: ArenaTeam.h:117
uint16 SeasonWins
Definition: ArenaTeam.h:116
uint16 WeekGames
Definition: ArenaTeam.h:113
uint16 SeasonGames
Definition: ArenaTeam.h:115
Definition: ArenaTeam.h:138
ObjectGuid GetCaptain() const
Definition: ArenaTeam.h:154
ArenaTeamMember * GetMember(ObjectGuid guid)
Definition: ArenaTeam.cpp:1012
uint32 GetType() const
Definition: ArenaTeam.h:150
static std::unordered_map< uint32, uint8 > ArenaSlotByType
Definition: ArenaTeam.h:218
uint32 * m_uint32Values
Definition: Object.h:246
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
Definition: Player.cpp:16145

References ARENA_TEAM_END, ARENA_TEAM_GAMES_SEASON, ARENA_TEAM_GAMES_WEEK, ARENA_TEAM_ID, ARENA_TEAM_MEMBER, ARENA_TEAM_PERSONAL_RATING, ARENA_TEAM_TYPE, ARENA_TEAM_WINS_SEASON, ArenaTeam::ArenaSlotByType, ArenaTeam::GetCaptain(), Object::GetGUID(), ArenaTeam::GetMember(), ArenaTeam::GetType(), LOG_ERROR, Object::m_uint32Values, MAX_ARENA_SLOT, ArenaTeamMember::PersonalRating, PLAYER_FIELD_ARENA_TEAM_INFO_1_1, sArenaTeamMgr, sCharacterCache, ArenaTeamMember::SeasonGames, ArenaTeamMember::SeasonWins, SetArenaTeamInfoField(), and ArenaTeamMember::WeekGames.

Referenced by LoadFromDB().

◆ _LoadAuras()

void Player::_LoadAuras ( PreparedQueryResult  result,
uint32  timediff 
)
protected
5715{
5716 LOG_DEBUG("entities.player.loading", "Loading auras for player {}", GetGUID().ToString());
5717
5718 /* 0 1 2 3 4 5 6 7 8 9 10 11
5719 QueryResult* result = CharacterDatabase.Query("SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
5720 12 13 14
5721 maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '{}'", GetGUID().GetCounter());
5722 */
5723
5724 if (result)
5725 {
5726 do
5727 {
5728 Field* fields = result->Fetch();
5729 int32 damage[3];
5730 int32 baseDamage[3];
5731 ObjectGuid caster_guid = ObjectGuid(fields[0].Get<uint64>());
5732 ObjectGuid itemGuid = ObjectGuid(fields[1].Get<uint64>());
5733 uint32 spellid = fields[2].Get<uint32>();
5734 uint8 effmask = fields[3].Get<uint8>();
5735 uint8 recalculatemask = fields[4].Get<uint8>();
5736 uint8 stackcount = fields[5].Get<uint8>();
5737 damage[0] = fields[6].Get<int32>();
5738 damage[1] = fields[7].Get<int32>();
5739 damage[2] = fields[8].Get<int32>();
5740 baseDamage[0] = fields[9].Get<int32>();
5741 baseDamage[1] = fields[10].Get<int32>();
5742 baseDamage[2] = fields[11].Get<int32>();
5743 int32 maxduration = fields[12].Get<int32>();
5744 int32 remaintime = fields[13].Get<int32>();
5745 uint8 remaincharges = fields[14].Get<uint8>();
5746
5747 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
5748 if (!spellInfo)
5749 {
5750 LOG_ERROR("entities.player", "Unknown aura (spellid {}), ignore.", spellid);
5751 continue;
5752 }
5753
5754 // Xinef: leave this
5755 if (spellInfo->HasAura(SPELL_AURA_MOUNTED))
5756 {
5757 SetMountBlockId(spellInfo->Id);
5758 continue;
5759 }
5760
5761 // negative effects should continue counting down after logout
5762 if (remaintime != -1 && ((!spellInfo->IsPositive() && spellInfo->Id != 15007) || spellInfo->HasAttribute(SPELL_ATTR4_AURA_EXPIRES_OFFLINE))) // Xinef: resurrection sickness should not tick when logged off
5763 {
5764 if (remaintime / IN_MILLISECONDS <= int32(timediff))
5765 continue;
5766
5767 remaintime -= timediff * IN_MILLISECONDS;
5768 }
5769
5770 // prevent wrong values of remaincharges
5771 if (spellInfo->ProcCharges)
5772 {
5773 // we have no control over the order of applying auras and modifiers allow auras
5774 // to have more charges than value in SpellInfo
5775 if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
5776 remaincharges = spellInfo->ProcCharges;
5777 }
5778 else
5779 remaincharges = 0;
5780
5781 if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid, itemGuid))
5782 {
5783 if (!aura->CanBeSaved())
5784 {
5785 aura->Remove();
5786 continue;
5787 }
5788
5789 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
5790 aura->ApplyForTargets();
5791 LOG_DEBUG("entities.player", "Added aura spellid {}, effectmask {}", spellInfo->Id, effmask);
5792 }
5793 } while (result->NextRow());
5794 }
5795}
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ SPELL_ATTR4_AURA_EXPIRES_OFFLINE
Definition: SharedDefines.h:532
Definition: ObjectGuid.h:118
void SetMountBlockId(uint32 mount)
Definition: Player.h:2581
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352

References Field::Get(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, SetMountBlockId(), SPELL_ATTR4_AURA_EXPIRES_OFFLINE, SPELL_AURA_MOUNTED, sSpellMgr, Position::ToString(), and Aura::TryCreate().

Referenced by LoadFromDB().

◆ _LoadBrewOfTheMonth()

void Player::_LoadBrewOfTheMonth ( PreparedQueryResult  result)
protected
15732{
15733 uint32 lastEventId = 0;
15734 if (result)
15735 {
15736 Field* fields = result->Fetch();
15737 lastEventId = fields[0].Get<uint32>();
15738 }
15739
15740 uint16 month = static_cast<uint16>(Acore::Time::GetMonth());
15741 uint16 eventId = month;
15742 if (eventId < 9)
15743 eventId += 3;
15744 else
15745 eventId -= 9;
15746
15747 // Brew of the Month October (first in list)
15748 eventId += 34;
15749
15750 if (lastEventId != eventId && IsEventActive(eventId) && HasAchieved(2796 /* Brew of the Month*/))
15751 {
15752 // Send Mail
15753 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15754 MailSender sender(MAIL_CREATURE, 27487 /*NPC_BREW_OF_THE_MONTH_CLUB*/);
15755 MailDraft draft(uint16(212 + month)); // 212 is starting template id
15756 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
15757
15758 // Update Event Id
15760 stmt->SetData(0, GetGUID().GetCounter());
15761 stmt->SetData(1, uint32(eventId));
15762 trans->Append(stmt);
15763
15764 CharacterDatabase.CommitTransaction(trans);
15765 }
15766}
@ MAIL_CREATURE
Definition: Mail.h:40
bool IsEventActive(uint16 event_id)
Definition: GameEventMgr.cpp:1925
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:70
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
@ CHAR_REP_BREW_OF_THE_MONTH
Definition: CharacterDatabase.h:103
AC_COMMON_API uint32 GetMonth(Seconds time=0s)
Definition: Timer.cpp:424
Definition: PreparedStatement.h:158
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78
bool HasAchieved(uint32 achievementId) const
Definition: Player.cpp:13863
Definition: Mail.h:84
Definition: Mail.h:106
Definition: Mail.h:120

References CHAR_REP_BREW_OF_THE_MONTH, CharacterDatabase, Field::Get(), Object::GetGUID(), Acore::Time::GetMonth(), HasAchieved(), IsEventActive(), MAIL_CREATURE, MailDraft::SendMailTo(), and PreparedStatementBase::SetData().

Referenced by LoadFromDB().

◆ _LoadCharacterSettings()

void Player::_LoadCharacterSettings ( PreparedQueryResult  result)
protected
27{
28 m_charSettingsMap.clear();
29
30 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
31 {
32 return;
33 }
34
35 if (result)
36 {
37 do
38 {
39 Field* fields = result->Fetch();
40
41 std::string source = fields[0].Get<std::string>();;
42 std::string data = fields[1].Get<std::string>();
43
44 std::vector<std::string_view> tokens = Acore::Tokenize(data, ' ', false);
45
46 PlayerSettingVector setting;
47 setting.resize(tokens.size());
48
49 uint32 count = 0;
50
51 for (auto& token : tokens)
52 {
53 if (token.empty())
54 {
55 continue;
56 }
57
58 PlayerSetting set;
59 set.value = Acore::StringTo<uint32>(token).value();
60 setting[count] = set;
61 ++count;
62 }
63
64 m_charSettingsMap[source] = setting;
65
66 } while (result->NextRow());
67 }
68}
std::vector< PlayerSetting > PlayerSettingVector
Definition: PlayerSettings.h:48
@ CONFIG_PLAYER_SETTINGS_ENABLED
Definition: IWorld.h:176
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition: Tokenize.cpp:20
PlayerSettingMap m_charSettingsMap
Definition: Player.h:2969
Definition: PlayerSettings.h:39
uint32 value
Definition: PlayerSettings.h:40

References CONFIG_PLAYER_SETTINGS_ENABLED, Field::Get(), m_charSettingsMap, sWorld, Acore::Tokenize(), and PlayerSetting::value.

Referenced by LoadFromDB().

◆ _LoadDailyQuestStatus()

void Player::_LoadDailyQuestStatus ( PreparedQueryResult  result)
protected
6365{
6366 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
6367 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
6368
6369 m_DFQuests.clear();
6370
6371 //QueryResult* result = CharacterDatabase.Query("SELECT quest, time FROM character_queststatus_daily WHERE guid = '{}'", GetGUID().GetCounter());
6372
6373 if (result)
6374 {
6375 uint32 quest_daily_idx = 0;
6376
6377 do
6378 {
6379 Field* fields = result->Fetch();
6380 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(fields[0].Get<uint32>()))
6381 {
6382 if (qQuest->IsDFQuest())
6383 {
6384 m_DFQuests.insert(qQuest->GetQuestId());
6385 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6386 continue;
6387 }
6388 }
6389
6390 if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
6391 {
6392 LOG_ERROR("entities.player", "Player ({}) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().ToString());
6393 break;
6394 }
6395
6396 uint32 quest_id = fields[0].Get<uint32>();
6397
6398 // save _any_ from daily quest times (it must be after last reset anyway)
6399 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6400
6401 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6402 if (!quest)
6403 continue;
6404
6405 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
6406 ++quest_daily_idx;
6407
6408 LOG_DEBUG("entities.player.loading", "Daily quest ({}) cooldown for player ({})", quest_id, GetGUID().ToString());
6409 } while (result->NextRow());
6410 }
6411
6412 m_DailyQuestChanged = false;
6413}
@ PLAYER_FIELD_DAILY_QUESTS_1
Definition: UpdateFields.h:385
#define PLAYER_MAX_DAILY_QUESTS
Definition: Player.h:71
DFQuestsDoneList m_DFQuests
Definition: Player.h:2386
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21203
Definition: QuestDef.h:209

References Field::Get(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadDeclinedNames()

void Player::_LoadDeclinedNames ( PreparedQueryResult  result)
protected
4801{
4802 if (!result)
4803 return;
4804
4805 delete m_declinedname;
4807 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
4808 m_declinedname->name[i] = (*result)[i].Get<std::string>();
4809}
#define MAX_DECLINED_NAME_CASES
Definition: Unit.h:528
Definition: Unit.h:531
std::string name[MAX_DECLINED_NAME_CASES]
Definition: Unit.h:532

References m_declinedname, MAX_DECLINED_NAME_CASES, and DeclinedName::name.

Referenced by LoadFromDB().

◆ _LoadEntryPointData()

void Player::_LoadEntryPointData ( PreparedQueryResult  result)
protected
4874{
4875 if (!result)
4876 return;
4877
4878 Field* fields = result->Fetch();
4879 m_entryPointData.joinPos = WorldLocation(fields[4].Get<uint32>(), // Map
4880 fields[0].Get<float>(), // X
4881 fields[1].Get<float>(), // Y
4882 fields[2].Get<float>(), // Z
4883 fields[3].Get<float>()); // Orientation
4884
4885 m_entryPointData.taxiPath[0] = fields[5].Get<uint32>();
4886 m_entryPointData.taxiPath[1] = fields[6].Get<uint32>();
4887 m_entryPointData.mountSpell = fields[7].Get<uint32>();
4888}
Definition: Position.h:251
uint32 mountSpell
Definition: Player.h:1054
std::array< uint32, 2 > taxiPath
Definition: Player.h:1055
WorldLocation joinPos
Definition: Player.h:1056
EntryPointData m_entryPointData
Definition: Player.h:2649

References Field::Get(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, and EntryPointData::taxiPath.

Referenced by LoadFromDB().

◆ _LoadEquipmentSets()

void Player::_LoadEquipmentSets ( PreparedQueryResult  result)
protected
4843{
4844 // SetQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '{}' ORDER BY setindex", m_guid.GetCounter());
4845 if (!result)
4846 return;
4847
4848 uint32 count = 0;
4849 do
4850 {
4851 Field* fields = result->Fetch();
4852 EquipmentSet eqSet;
4853
4854 eqSet.Guid = fields[0].Get<uint64>();
4855 uint8 index = fields[1].Get<uint8>();
4856 eqSet.Name = fields[2].Get<std::string>();
4857 eqSet.IconName = fields[3].Get<std::string>();
4858 eqSet.IgnoreMask = fields[4].Get<uint32>();
4860
4861 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
4862 eqSet.Items[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].Get<uint32>());
4863
4864 m_EquipmentSets[index] = eqSet;
4865
4866 ++count;
4867
4868 if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
4869 break;
4870 } while (result->NextRow());
4871}
@ EQUIPMENT_SET_UNCHANGED
Definition: Player.h:742
#define MAX_EQUIPMENT_SET_INDEX
Definition: Player.h:760
@ EQUIPMENT_SLOT_END
Definition: Player.h:694
std::uint64_t uint64
Definition: Define.h:106
Definition: Player.h:749
ObjectGuid Items[EQUIPMENT_SLOT_END]
Definition: Player.h:756
std::string Name
Definition: Player.h:753
std::string IconName
Definition: Player.h:754
EquipmentSetUpdateState state
Definition: Player.h:757
uint64 Guid
Definition: Player.h:752
uint32 IgnoreMask
Definition: Player.h:755
EquipmentSets m_EquipmentSets
Definition: Player.h:2877

References EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, Field::Get(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, MAX_EQUIPMENT_SET_INDEX, EquipmentSet::Name, and EquipmentSet::state.

Referenced by LoadFromDB().

◆ _LoadFriendList()

void Player::_LoadFriendList ( PreparedQueryResult  result)
protected

◆ _LoadGlyphAuras()

void Player::_LoadGlyphAuras ( )
protected
5798{
5799 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
5800 {
5801 if (uint32 glyph = GetGlyph(i))
5802 {
5803 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
5804 {
5805 if (GlyphSlotEntry const* glyphSlotEntry = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
5806 {
5807 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyphEntry->SpellId);
5808 if (glyphEntry->TypeFlags == glyphSlotEntry->TypeFlags)
5809 {
5810 if (!spellInfo->Stances)
5812 continue;
5813 }
5814 else
5815 LOG_ERROR("entities.player", "Player {} has glyph with typeflags {} in slot with typeflags {}, removing.", m_name, glyphEntry->TypeFlags, glyphSlotEntry->TypeFlags);
5816 }
5817 else
5818 LOG_ERROR("entities.player", "Player {} has not existing glyph slot entry {} on index {}", m_name, GetGlyphSlot(i), i);
5819 }
5820 else
5821 LOG_ERROR("entities.player", "Player {} has not existing glyph entry {} on index {}", m_name, glyph, i);
5822
5823 // On any error remove glyph
5824 SetGlyph(i, 0, true);
5825 }
5826 }
5827}
DBCStorage< GlyphSlotEntry > sGlyphSlotStore(GlyphSlotfmt)
DBCStorage< GlyphPropertiesEntry > sGlyphPropertiesStore(GlyphPropertiesfmt)
TriggerCastFlags
Definition: SpellDefines.h:130
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:148
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
Definition: SpellDefines.h:143
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
Definition: SpellDefines.h:142
std::string m_name
Definition: Object.h:636
uint32 GetGlyph(uint8 slot) const
Definition: Player.h:1746
uint32 GetGlyphSlot(uint8 slot) const
Definition: Player.h:1737
void SetGlyph(uint8 slot, uint32 glyph, bool save)
Definition: Player.h:1738
Definition: DBCStructure.h:1021
Definition: DBCStructure.h:1029

References Unit::CastSpell(), GetGlyph(), GetGlyphSlot(), LOG_ERROR, WorldObject::m_name, MAX_GLYPH_SLOT_INDEX, SetGlyph(), sGlyphPropertiesStore, sGlyphSlotStore, sSpellMgr, SpellInfo::Stances, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, and TRIGGERED_IGNORE_SHAPESHIFT.

Referenced by LoadFromDB().

◆ _LoadGlyphs()

void Player::_LoadGlyphs ( PreparedQueryResult  result)
protected
14905{
14906 // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u'
14907 if (!result)
14908 return;
14909
14910 do
14911 {
14912 Field* fields = result->Fetch();
14913
14914 uint8 spec = fields[0].Get<uint8>();
14915 if (spec >= m_specsCount)
14916 continue;
14917
14918 m_Glyphs[spec][0] = fields[1].Get<uint16>();
14919 m_Glyphs[spec][1] = fields[2].Get<uint16>();
14920 m_Glyphs[spec][2] = fields[3].Get<uint16>();
14921 m_Glyphs[spec][3] = fields[4].Get<uint16>();
14922 m_Glyphs[spec][4] = fields[5].Get<uint16>();
14923 m_Glyphs[spec][5] = fields[6].Get<uint16>();
14924 } while (result->NextRow());
14925}

References Field::Get(), m_Glyphs, and m_specsCount.

Referenced by LoadFromDB().

◆ _LoadGroup()

void Player::_LoadGroup ( )
protected
6496{
6497 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(GetGUID()))
6498 {
6499 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
6500 {
6501 if (group->GetMemberGroup(GetGUID()) <= MAX_RAID_SUBGROUPS)
6502 {
6503 if (group->IsLeader(GetGUID()))
6504 {
6506 }
6507
6508 uint8 subgroup = group->GetMemberGroup(GetGUID());
6509 SetGroup(group, subgroup);
6510
6511 // the group leader may change the instance difficulty while the player is offline
6512 SetDungeonDifficulty(group->GetDungeonDifficulty());
6513 SetRaidDifficulty(group->GetRaidDifficulty());
6514 }
6515 }
6516 }
6517
6518 if (!GetGroup() || !GetGroup()->IsLeader(GetGUID()))
6520}
#define sGroupMgr
Definition: GroupMgr.h:51
#define MAX_RAID_SUBGROUPS
Definition: Group.h:45
@ PLAYER_FLAGS_GROUP_LEADER
Definition: Player.h:474
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1108
void RemovePlayerFlag(PlayerFlags flags)
Definition: Player.h:1109
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition: Player.h:1900
void SetGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:11515
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition: Player.h:1901
Group * GetGroup()
Definition: Player.h:2444
Definition: Group.h:169

References GetGroup(), Object::GetGUID(), MAX_RAID_SUBGROUPS, PLAYER_FLAGS_GROUP_LEADER, RemovePlayerFlag(), sCharacterCache, SetDungeonDifficulty(), SetGroup(), SetPlayerFlag(), SetRaidDifficulty(), and sGroupMgr.

Referenced by LoadFromDB().

◆ _LoadHomeBind()

bool Player::_LoadHomeBind ( PreparedQueryResult  result)
protected
7003{
7004 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
7005 if (!info)
7006 {
7007 LOG_ERROR("entities.player", "Player (Name {}) has incorrect race/class pair. Can't be loaded.", GetName());
7008 return false;
7009 }
7010
7011 bool ok = false;
7012 // SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?
7013 if (result)
7014 {
7015 Field* fields = result->Fetch();
7016
7017 m_homebindMapId = fields[0].Get<uint16>();
7018 m_homebindAreaId = fields[1].Get<uint16>();
7019 m_homebindX = fields[2].Get<float>();
7020 m_homebindY = fields[3].Get<float>();
7021 m_homebindZ = fields[4].Get<float>();
7022
7023 MapEntry const* bindMapEntry = sMapStore.LookupEntry(m_homebindMapId);
7024
7025 // accept saved data only for valid position (and non instanceable), and accessable
7027 !bindMapEntry->Instanceable() && GetSession()->Expansion() >= bindMapEntry->Expansion())
7028 ok = true;
7029 else
7030 {
7032 stmt->SetData(0, GetGUID().GetCounter());
7033 CharacterDatabase.Execute(stmt);
7034 }
7035 }
7036
7037 if (!ok)
7038 {
7039 m_homebindMapId = info->mapId;
7040 m_homebindAreaId = info->areaId;
7041 m_homebindX = info->positionX;
7042 m_homebindY = info->positionY;
7043 m_homebindZ = info->positionZ;
7044
7046 stmt->SetData(0, GetGUID().GetCounter());
7047 stmt->SetData(1, m_homebindMapId);
7048 stmt->SetData(2, m_homebindAreaId);
7049 stmt->SetData (3, m_homebindX);
7050 stmt->SetData (4, m_homebindY);
7051 stmt->SetData (5, m_homebindZ);
7052 CharacterDatabase.Execute(stmt);
7053 }
7054
7055 LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}",
7057 return true;
7058}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
@ CHAR_INS_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:240
@ CHAR_DEL_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:242
std::string const & GetName() const
Definition: Object.h:456
LowType GetCounter() const
Definition: ObjectGuid.h:145
Definition: Player.h:335
float positionX
Definition: Player.h:341
uint32 areaId
Definition: Player.h:340
float positionY
Definition: Player.h:342
float positionZ
Definition: Player.h:343
uint32 mapId
Definition: Player.h:339
uint8 getClass() const
Definition: Unit.h:765
uint8 getRace(bool original=false) const
Definition: Unit.cpp:20909
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition: MapMgr.h:91
uint8 Expansion() const
Definition: WorldSession.h:373
Definition: DBCStructure.h:1325

References PlayerInfo::areaId, CHAR_DEL_PLAYER_HOMEBIND, CHAR_INS_PLAYER_HOMEBIND, CharacterDatabase, WorldSession::Expansion(), Field::Get(), Unit::getClass(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), GetSession(), MapMgr::IsValidMapCoord(), LOG_DEBUG, LOG_ERROR, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PreparedStatementBase::SetData(), sMapStore, and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadInstanceTimeRestrictions()

void Player::_LoadInstanceTimeRestrictions ( PreparedQueryResult  result)
protected
15720{
15721 if (!result)
15722 return;
15723
15724 do
15725 {
15726 Field* fields = result->Fetch();
15727 _instanceResetTimes.insert(InstanceTimeMap::value_type(fields[0].Get<uint32>(), fields[1].Get<uint64>()));
15728 } while (result->NextRow());
15729}
InstanceTimeMap _instanceResetTimes
Definition: Player.h:2949

References _instanceResetTimes.

Referenced by LoadFromDB().

◆ _LoadInventory()

void Player::_LoadInventory ( PreparedQueryResult  result,
uint32  timeDiff 
)
protected
5850{
5851 //QueryResult* result = CharacterDatabase.Query("SELECT data, text, bag, slot, item, item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '{}' ORDER BY bag, slot", GetGUID().GetCounter());
5852 //NOTE: the "order by `bag`" is important because it makes sure
5853 //the bagMap is filled before items in the bags are loaded
5854 //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?)
5855 //expected to be equipped before offhand items (TODO: fixme)
5856
5857 if (result)
5858 {
5859 uint32 zoneId = GetZoneId();
5860
5861 std::map<ObjectGuid::LowType, Bag*> bagMap; // fast guid lookup for bags
5862 std::map<ObjectGuid::LowType, Item*> invalidBagMap; // fast guid lookup for bags
5863 std::list<Item*> problematicItems;
5864 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
5865
5866 // Prevent items from being added to the queue while loading
5868 do
5869 {
5870 Field* fields = result->Fetch();
5871 if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
5872 {
5873 ObjectGuid::LowType bagGuid = fields[11].Get<uint32>();
5874 uint8 slot = fields[12].Get<uint8>();
5875
5876 uint8 err = EQUIP_ERR_OK;
5877 // Item is not in bag
5878 if (!bagGuid)
5879 {
5880 item->SetContainer(nullptr);
5881 item->SetSlot(slot);
5882
5884 {
5885 ItemPosCountVec dest;
5886 err = CanStoreItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false);
5887 if (err == EQUIP_ERR_OK)
5888 item = StoreItem(dest, item, true);
5889 }
5890 else if (IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot))
5891 {
5892 uint16 dest;
5893 if (sScriptMgr->CheckItemInSlotAtLoadInventory(this, item, slot, err, dest))
5894 err = CanEquipItem(slot, dest, item, false, false);
5895 if (err == EQUIP_ERR_OK)
5896 QuickEquipItem(dest, item);
5897 }
5898 else if (IsBankPos(INVENTORY_SLOT_BAG_0, slot))
5899 {
5900 ItemPosCountVec dest;
5901 err = CanBankItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false, false);
5902 if (err == EQUIP_ERR_OK)
5903 item = BankItem(dest, item, true);
5904 }
5905
5906 // Remember bags that may contain items in them
5907 if (err == EQUIP_ERR_OK)
5908 {
5909 if (IsBagPos(item->GetPos()))
5910 if (Bag* pBag = item->ToBag())
5911 bagMap[item->GetGUID().GetCounter()] = pBag;
5912 }
5913 else if (IsBagPos(item->GetPos()))
5914 if (item->IsBag())
5915 invalidBagMap[item->GetGUID().GetCounter()] = item;
5916 }
5917 else
5918 {
5919 item->SetSlot(NULL_SLOT);
5920 // Item is in the bag, find the bag
5921 std::map<ObjectGuid::LowType, Bag*>::iterator itr = bagMap.find(bagGuid);
5922 if (itr != bagMap.end())
5923 {
5924 ItemPosCountVec dest;
5925 err = CanStoreItem(itr->second->GetSlot(), slot, dest, item);
5926 if (err == EQUIP_ERR_OK)
5927 item = StoreItem(dest, item, true);
5928 }
5929 else if (invalidBagMap.find(bagGuid) != invalidBagMap.end())
5930 {
5931 std::map<ObjectGuid::LowType, Item*>::iterator iterator = invalidBagMap.find(bagGuid);
5932 if (std::find(problematicItems.begin(), problematicItems.end(), iterator->second) != problematicItems.end())
5933 {
5935 }
5936 }
5937 else
5938 {
5939 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which doesnt have a valid bag (Bag GUID: {}, slot: {}). Possible cheat?",
5940 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot);
5941 item->DeleteFromInventoryDB(trans);
5942 delete item;
5943 continue;
5944 }
5945 }
5946
5947 // Item's state may have changed after storing
5948 if (err == EQUIP_ERR_OK)
5949 item->SetState(ITEM_UNCHANGED, this);
5950 else
5951 {
5952 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which can't be loaded into inventory (Bag GUID: {}, slot: {}) by reason {}. Item will be sent by mail.",
5953 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot, err);
5954 item->DeleteFromInventoryDB(trans);
5955 problematicItems.push_back(item);
5956 }
5957 }
5958 } while (result->NextRow());
5959
5961
5962 // Send problematic items by mail
5963 while (!problematicItems.empty())
5964 {
5965 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
5966
5967 MailDraft draft(subject, "There were problems with equipping item(s).");
5968 for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
5969 {
5970 draft.AddItem(problematicItems.front());
5971 problematicItems.pop_front();
5972 }
5973 draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
5974 }
5975 CharacterDatabase.CommitTransaction(trans);
5976 }
5977 //if (IsAlive())
5979}
#define MAX_MAIL_ITEMS
Definition: Mail.h:34
@ MAIL_CHECK_MASK_COPIED
This mail was returned. Do not allow returning mail back again.
Definition: Mail.h:50
@ MAIL_STATIONERY_GM
Definition: Mail.h:60
@ EQUIP_ERR_OK
Definition: Item.h:47
@ EQUIP_ERR_INT_BAG_ERROR
Definition: Item.h:87
@ ITEM_UNCHANGED
Definition: Item.h:209
@ NULL_SLOT
Definition: Item.h:41
std::vector< ItemPosCount > ItemPosCountVec
Definition: Player.h:771
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:670
@ LANG_NOT_EQUIPPED_ITEM
Definition: Language.h:671
Definition: Bag.h:28
Bag * ToBag()
Definition: Item.h:250
uint32 GetZoneId() const
Definition: Object.cpp:3141
uint32 LowType
Definition: ObjectGuid.h:122
static bool IsEquipmentPos(uint16 pos)
Definition: Player.h:1255
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition: PlayerStorage.cpp:1828
void QuickEquipItem(uint16 pos, Item *pItem)
Definition: PlayerStorage.cpp:2850
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
Definition: Player.h:1324
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
Definition: Player.h:1275
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2589
static bool IsInventoryPos(uint16 pos)
Definition: Player.h:1253
Item * _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
Definition: PlayerStorage.cpp:5981
static bool IsBagPos(uint16 pos)
Definition: PlayerStorage.cpp:613
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition: PlayerStorage.cpp:2047
static bool IsBankPos(uint16 pos)
Definition: Player.h:1258
char const * GetAcoreString(uint32 entry) const
Definition: WorldSession.cpp:790

References _ApplyAllItemMods(), _LoadItem(), MailDraft::AddItem(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CharacterDatabase, EQUIP_ERR_INT_BAG_ERROR, EQUIP_ERR_OK, Field::Get(), WorldSession::GetAcoreString(), Object::GetGUID(), WorldObject::GetName(), GetSession(), WorldObject::GetZoneId(), INVENTORY_SLOT_BAG_0, IsBagPos(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), ITEM_UNCHANGED, LANG_NOT_EQUIPPED_ITEM, LOG_ERROR, m_itemUpdateQueueBlocked, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MAX_MAIL_ITEMS, NULL_SLOT, QuickEquipItem(), MailDraft::SendMailTo(), sScriptMgr, StoreItem(), Item::ToBag(), and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadItem()

Item * Player::_LoadItem ( CharacterDatabaseTransaction  trans,
uint32  zoneId,
uint32  timeDiff,
Field fields 
)
private
5982{
5983 Item* item = nullptr;
5984 ObjectGuid::LowType itemGuid = fields[13].Get<uint32>();
5985 uint32 itemEntry = fields[14].Get<uint32>();
5986 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
5987 {
5988 bool remove = false;
5989 item = NewItemOrBag(proto);
5990 if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
5991 {
5992 CharacterDatabasePreparedStatement* stmt = nullptr;
5993
5994 // Do not allow to have item limited to another map/zone in alive state
5995 if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
5996 {
5997 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', map: {}) has item ({}, entry: {}) limited to another map ({}). Deleting item.",
5998 GetGUID().ToString(), GetName(), GetMapId(), item->GetGUID().ToString(), item->GetEntry(), zoneId);
5999 remove = true;
6000 }
6001 // "Conjured items disappear if you are logged out for more than 15 minutes"
6002 else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED))
6003 {
6004 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.",
6005 GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry());
6006 remove = true;
6007 }
6008 else if (item->IsRefundable())
6009 {
6010 if (item->GetPlayedTime() > (2 * HOUR))
6011 {
6012 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
6013 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), item->GetPlayedTime());
6014 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
6015 stmt->SetData(0, item->GetGUID().GetCounter());
6016 trans->Append(stmt);
6017
6019 }
6020 else
6021 {
6022 // xinef: sync query
6023 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
6024 stmt->SetData(0, item->GetGUID().GetCounter());
6025 stmt->SetData(1, GetGUID().GetCounter());
6026 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6027 {
6028 item->SetRefundRecipient((*result)[0].Get<uint32>());
6029 item->SetPaidMoney((*result)[1].Get<uint32>());
6030 item->SetPaidExtendedCost((*result)[2].Get<uint16>());
6031 AddRefundReference(item->GetGUID());
6032 }
6033 else
6034 {
6035 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with refundable flags, but without data in item_refund_instance. Removing flag.",
6036 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6038 }
6039 }
6040 }
6041 else if (item->IsBOPTradable())
6042 {
6043 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
6044 stmt->SetData(0, item->GetGUID().GetCounter());
6045
6046 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6047 {
6048 AllowedLooterSet looters;
6049 for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
6050 {
6051 if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
6052 {
6053 looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
6054 }
6055 else
6056 {
6057 LOG_WARN("entities.player.loading", "Player::_LoadInventory: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
6058 }
6059 }
6060
6061 if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
6062 {
6063 item->SetSoulboundTradeable(looters);
6064 AddTradeableItem(item);
6065 }
6066 else
6067 item->ClearSoulboundTradeable(this);
6068 }
6069 else
6070 {
6071 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with ITEM_FIELD_FLAG_BOP_TRADEABLE flag, but without data in item_soulbound_trade_data. Removing flag.",
6072 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6074 }
6075 }
6076 else if (proto->HolidayId)
6077 {
6078 remove = true;
6079 GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
6080 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
6081 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
6082 {
6083 if (uint32(events[*itr].holiday_id) == proto->HolidayId)
6084 {
6085 remove = false;
6086 break;
6087 }
6088 }
6089 }
6090 }
6091 else
6092 {
6093 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has broken item (GUID: {}, entry: {}) in inventory. Deleting item.",
6094 GetGUID().ToString(), GetName(), itemGuid, itemEntry);
6095 remove = true;
6096 }
6097 // Remove item from inventory if necessary
6098 if (remove)
6099 {
6100 Item::DeleteFromInventoryDB(trans, itemGuid);
6101 item->FSetState(ITEM_REMOVED);
6102 item->SaveToDB(trans); // it also deletes item object!
6103 item = nullptr;
6104 }
6105 }
6106 else
6107 {
6108 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has unknown item (entry: {}) in inventory. Deleting item.",
6109 GetGUID().ToString(), GetName(), itemEntry);
6110 Item::DeleteFromInventoryDB(trans, itemGuid);
6111 Item::DeleteFromDB(trans, itemGuid);
6112 }
6113 return item;
6114}
@ ITEM_FIELD_FLAGS
Definition: UpdateFields.h:42
@ ITEM_REMOVED
Definition: Item.h:212
@ ITEM_FIELD_FLAG_REFUNDABLE
Definition: ItemTemplate.h:121
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
Definition: ItemTemplate.h:117
@ ITEM_FLAG_CONJURED
Definition: ItemTemplate.h:148
Item * NewItemOrBag(ItemTemplate const *proto)
Definition: Bag.h:67
GuidSet AllowedLooterSet
Definition: LootMgr.h:152
#define sGameEventMgr
Definition: GameEventMgr.h:186
events
Definition: boss_sartura.cpp:43
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:46
@ CHAR_DEL_ITEM_REFUND_INSTANCE
Definition: CharacterDatabase.h:371
@ CHAR_SEL_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:120
@ CHAR_SEL_ITEM_REFUNDS
Definition: CharacterDatabase.h:119
#define LOG_WARN(filterType__,...)
Definition: Log.h:160
constexpr auto HOUR
Definition: Common.h:47
constexpr auto MINUTE
Definition: Common.h:46
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:24
uint32 GetPlayedTime()
Definition: Item.cpp:1247
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:533
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition: Item.cpp:420
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:337
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
Definition: Item.cpp:1057
void SetSoulboundTradeable(AllowedLooterSet &allowedLooters)
Definition: Item.cpp:1259
void SetPaidMoney(uint32 money)
Definition: Item.h:345
bool IsSoulBound() const
Definition: Item.h:236
bool IsBOPTradable() const
Definition: Item.h:262
void SetRefundRecipient(ObjectGuid::LowType pGuidLow)
Definition: Item.h:344
bool IsRefundable() const
Definition: Item.h:261
void FSetState(ItemUpdateState state)
Definition: Item.h:330
void SetPaidExtendedCost(uint32 iece)
Definition: Item.h:346
void ClearSoulboundTradeable(Player *currentOwner)
Definition: Item.cpp:1265
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:519
uint32 GetMaxStackSize() const
Definition: ItemTemplate.h:729
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
uint32 GetEntry() const
Definition: Object.h:112
uint32 GetMapId() const
Definition: Position.h:276
void AddRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15457
void AddTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4147
bool IsAlive() const
Definition: Unit.h:1151
std::vector< GameEventData > GameEventDataMap
Definition: GameEventMgr.h:107
std::set< uint16 > ActiveEvents
Definition: GameEventMgr.h:106

References AddRefundReference(), AddTradeableItem(), CHAR_DEL_ITEM_REFUND_INSTANCE, CHAR_SEL_ITEM_BOP_TRADE, CHAR_SEL_ITEM_REFUNDS, CharacterDatabase, Item::ClearSoulboundTradeable(), Item::DeleteFromDB(), Item::DeleteFromInventoryDB(), Item::FSetState(), Field::Get(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), ItemTemplate::GetMaxStackSize(), WorldObject::GetName(), Item::GetPlayedTime(), Item::GetTemplate(), HOUR, Unit::IsAlive(), Item::IsBOPTradable(), Item::IsLimitedToAnotherMapOrZone(), Item::IsRefundable(), Item::IsSoulBound(), ITEM_FIELD_FLAG_BOP_TRADEABLE, ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_CONJURED, ITEM_REMOVED, Item::LoadFromDB(), LOG_DEBUG, LOG_ERROR, LOG_WARN, MINUTE, NewItemOrBag(), Object::RemoveFlag(), Item::SaveToDB(), PreparedStatementBase::SetData(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), Item::SetSoulboundTradeable(), sGameEventMgr, sObjectMgr, Acore::Tokenize(), ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory().

◆ _LoadMail()

void Player::_LoadMail ( PreparedQueryResult  mailsResult,
PreparedQueryResult  mailItemsResult 
)
protected
6170{
6171 time_t cur_time = GameTime::GetGameTime().count();
6172
6173 m_mail.clear();
6174
6175 std::unordered_map<uint32, Mail*> mailById;
6176
6177 if (mailsResult)
6178 {
6179 do
6180 {
6181 Field* fields = mailsResult->Fetch();
6182 Mail* m = new Mail;
6183
6184 m->messageID = fields[0].Get<uint32>();
6185 m->messageType = fields[1].Get<uint8>();
6186 m->sender = fields[2].Get<uint32>();
6187 m->receiver = fields[3].Get<uint32>();
6188 m->subject = fields[4].Get<std::string>();
6189 m->body = fields[5].Get<std::string>();
6190 m->expire_time = time_t(fields[6].Get<uint32>());
6191 m->deliver_time = time_t(fields[7].Get<uint32>());
6192 m->money = fields[8].Get<uint32>();
6193 m->COD = fields[9].Get<uint32>();
6194 m->checked = fields[10].Get<uint8>();
6195 m->stationery = fields[11].Get<uint8>();
6196 m->mailTemplateId = fields[12].Get<int16>();
6197
6198 if (cur_time > m->expire_time)
6199 {
6200 LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID);
6201 continue;
6202 }
6203
6204 if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId))
6205 {
6206 LOG_ERROR("entities.player", "Player::_LoadMail: Mail ({}) has nonexistent MailTemplateId ({}), remove at load", m->messageID, m->mailTemplateId);
6207 m->mailTemplateId = 0;
6208 }
6209
6211
6212 m_mail.push_back(m);
6213 mailById[m->messageID] = m;
6214 } while (mailsResult->NextRow());
6215 }
6216
6217 if (mailItemsResult)
6218 {
6219 do
6220 {
6221 Field* fields = mailItemsResult->Fetch();
6222 uint32 mailId = fields[14].Get<uint32>();
6223 _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
6224 } while (mailItemsResult->NextRow());
6225 }
6226
6228}
@ MAIL_STATE_UNCHANGED
Definition: Mail.h:69
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
std::int16_t int16
Definition: Define.h:104
void UpdateNextMailTimeAndUnreads()
Definition: PlayerUpdates.cpp:434
static Item * _LoadMailedItem(ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
Definition: PlayerStorage.cpp:6117
Definition: Mail.h:168
ObjectGuid::LowType receiver
Definition: Mail.h:174
uint8 messageType
Definition: Mail.h:170
uint32 messageID
Definition: Mail.h:169
time_t expire_time
Definition: Mail.h:179
uint32 sender
Definition: Mail.h:173
uint8 stationery
Definition: Mail.h:171
std::string subject
Definition: Mail.h:175
std::string body
Definition: Mail.h:176
time_t deliver_time
Definition: Mail.h:180
uint32 COD
Definition: Mail.h:182
uint32 checked
Definition: Mail.h:183
MailState state
Definition: Mail.h:184
uint32 money
Definition: Mail.h:181
uint16 mailTemplateId
Definition: Mail.h:172

References _LoadMailedItem(), Mail::body, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_mail, MAIL_STATE_UNCHANGED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::money, Mail::receiver, Mail::sender, sMailTemplateStore, Mail::state, Mail::stationery, Mail::subject, and UpdateNextMailTimeAndUnreads().

Referenced by LoadFromDB().

◆ _LoadMailedItem()

Item * Player::_LoadMailedItem ( ObjectGuid const &  playerGuid,
Player player,
uint32  mailId,
Mail mail,
Field fields 
)
staticprotected
6118{
6119 ObjectGuid::LowType itemGuid = fields[11].Get<uint32>();
6120 uint32 itemEntry = fields[12].Get<uint32>();
6121
6122 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry);
6123 if (!proto)
6124 {
6125 LOG_ERROR("entities.player", "Player {} ({}) has unknown item in mailed items (GUID: {}, Entry: {}) in mail ({}), deleted.",
6126 player ? player->GetName() : "<unknown>", playerGuid.ToString(), itemGuid, itemEntry, mailId);
6127
6128 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
6129
6131 stmt->SetData(0, itemGuid);
6132 trans->Append(stmt);
6133
6134 CharacterDatabase.CommitTransaction(trans);
6135 return nullptr;
6136 }
6137
6138 Item* item = NewItemOrBag(proto);
6139
6140 ObjectGuid ownerGuid = fields[13].Get<uint32>() ? ObjectGuid::Create<HighGuid::Player>(fields[13].Get<uint32>()) : ObjectGuid::Empty;
6141 if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
6142 {
6143 LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
6144
6146 stmt->SetData(0, itemGuid);
6147 CharacterDatabase.Execute(stmt);
6148
6149 item->FSetState(ITEM_REMOVED);
6150
6152 item->SaveToDB(temp);
6153 return nullptr;
6154 }
6155
6156 if (mail)
6157 {
6158 mail->AddItem(itemGuid, itemEntry);
6159 }
6160
6161 if (player)
6162 {
6163 player->AddMItem(item);
6164 }
6165
6166 return item;
6167}
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition: CharacterDatabase.h:113
@ CHAR_DEL_MAIL_ITEM
Definition: CharacterDatabase.h:112
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
void AddMItem(Item *it)
Definition: Player.h:1657
void AddItem(ObjectGuid::LowType itemGuidLow, uint32 item_template)
Definition: Mail.h:186

References Mail::AddItem(), AddMItem(), CHAR_DEL_INVALID_MAIL_ITEM, CHAR_DEL_MAIL_ITEM, CharacterDatabase, ObjectGuid::Empty, Item::FSetState(), Field::Get(), WorldObject::GetName(), ITEM_REMOVED, Item::LoadFromDB(), LOG_ERROR, NewItemOrBag(), Item::SaveToDB(), PreparedStatementBase::SetData(), sObjectMgr, and ObjectGuid::ToString().

Referenced by _LoadMail(), and DeleteFromDB().

◆ _LoadMonthlyQuestStatus()

void Player::_LoadMonthlyQuestStatus ( PreparedQueryResult  result)
protected
6461{
6462 m_monthlyquests.clear();
6463
6464 if (result)
6465 {
6466 do
6467 {
6468 Field* fields = result->Fetch();
6469 uint32 quest_id = fields[0].Get<uint32>();
6470 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6471 if (!quest)
6472 continue;
6473
6474 m_monthlyquests.insert(quest_id);
6475 LOG_DEBUG("entities.player.loading", "Monthly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6476 } while (result->NextRow());
6477 }
6478
6479 m_MonthlyQuestChanged = false;
6480}
QuestSet m_monthlyquests
Definition: Player.h:2661

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_MonthlyQuestChanged, m_monthlyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadPetStable()

void Player::_LoadPetStable ( uint8  petStableSlots,
PreparedQueryResult  result 
)
protected
15769{
15770 if (!petStableSlots && !result)
15771 return;
15772
15773 m_petStable = std::make_unique<PetStable>();
15774 m_petStable->MaxStabledPets = petStableSlots;
15775
15776 if (m_petStable->MaxStabledPets > MAX_PET_STABLES)
15777 {
15778 LOG_ERROR("entities.player", "Player::LoadFromDB: Player ({}) can't have more stable slots than {}, but has {} in DB",
15779 GetGUID().ToString(), MAX_PET_STABLES, m_petStable->MaxStabledPets);
15780
15781 m_petStable->MaxStabledPets = MAX_PET_STABLES;
15782 }
15783
15784 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15785 // SELECT id, entry, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ?
15786 if (result)
15787 {
15788 do
15789 {
15790 Field* fields = result->Fetch();
15791 PetStable::PetInfo petInfo;
15792 petInfo.PetNumber = fields[0].Get<uint32>();
15793 petInfo.CreatureId = fields[1].Get<uint32>();
15794 petInfo.DisplayId = fields[2].Get<uint32>();
15795 petInfo.Level = fields[3].Get<uint16>();
15796 petInfo.Experience = fields[4].Get<uint32>();
15797 petInfo.ReactState = ReactStates(fields[5].Get<uint8>());
15798 PetSaveMode slot = PetSaveMode(fields[6].Get<uint8>());
15799 petInfo.Name = fields[7].Get<std::string>();
15800 petInfo.WasRenamed = fields[8].Get<bool>();
15801 petInfo.Health = fields[9].Get<uint32>();
15802 petInfo.Mana = fields[10].Get<uint32>();
15803 petInfo.Happiness = fields[11].Get<uint32>();
15804 petInfo.ActionBar = fields[12].Get<std::string>();
15805 petInfo.LastSaveTime = fields[13].Get<uint32>();
15806 petInfo.CreatedBySpellId = fields[14].Get<uint32>();
15807 petInfo.Type = PetType(fields[15].Get<uint8>());
15808
15809 if (slot == PET_SAVE_AS_CURRENT)
15810 m_petStable->CurrentPet = std::move(petInfo);
15811 else if (slot >= PET_SAVE_FIRST_STABLE_SLOT && slot <= PET_SAVE_LAST_STABLE_SLOT)
15812 m_petStable->StabledPets[slot - 1] = std::move(petInfo);
15813 else if (slot == PET_SAVE_NOT_IN_SLOT)
15814 m_petStable->UnslottedPets.push_back(std::move(petInfo));
15815
15816 } while (result->NextRow());
15817 }
15818}
PetSaveMode
Definition: PetDefines.h:40
@ PET_SAVE_FIRST_STABLE_SLOT
Definition: PetDefines.h:43
@ PET_SAVE_LAST_STABLE_SLOT
Definition: PetDefines.h:44
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ PET_SAVE_AS_CURRENT
Definition: PetDefines.h:42
PetType
Definition: PetDefines.h:30
constexpr auto MAX_PET_STABLES
Definition: PetDefines.h:36
ReactStates
Definition: Unit.h:547
Definition: PetDefines.h:205
uint32 Mana
Definition: PetDefines.h:215
uint32 Happiness
Definition: PetDefines.h:216
uint32 CreatedBySpellId
Definition: PetDefines.h:218
uint32 Health
Definition: PetDefines.h:214
uint32 CreatureId
Definition: PetDefines.h:211
bool WasRenamed
Definition: PetDefines.h:222
uint8 Level
Definition: PetDefines.h:219
uint32 DisplayId
Definition: PetDefines.h:212
ReactStates ReactState
Definition: PetDefines.h:220
std::string Name
Definition: PetDefines.h:208
PetType Type
Definition: PetDefines.h:221
uint32 Experience
Definition: PetDefines.h:213
uint32 PetNumber
Definition: PetDefines.h:210
uint32 LastSaveTime
Definition: PetDefines.h:217
std::string ActionBar
Definition: PetDefines.h:209
std::unique_ptr< PetStable > m_petStable
Definition: Player.h:2936

References PetStable::PetInfo::ActionBar, PetStable::PetInfo::CreatedBySpellId, PetStable::PetInfo::CreatureId, PetStable::PetInfo::DisplayId, PetStable::PetInfo::Experience, Field::Get(), Object::GetGUID(), PetStable::PetInfo::Happiness, PetStable::PetInfo::Health, PetStable::PetInfo::LastSaveTime, PetStable::PetInfo::Level, LOG_ERROR, m_petStable, PetStable::PetInfo::Mana, MAX_PET_STABLES, PetStable::PetInfo::Name, PET_SAVE_AS_CURRENT, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT, PET_SAVE_NOT_IN_SLOT, PetStable::PetInfo::PetNumber, PetStable::PetInfo::ReactState, Position::ToString(), PetStable::PetInfo::Type, and PetStable::PetInfo::WasRenamed.

Referenced by LoadFromDB().

◆ _LoadQuestStatus()

void Player::_LoadQuestStatus ( PreparedQueryResult  result)
protected
6243{
6244 uint16 slot = 0;
6245
6247 //QueryResult* result = CharacterDatabase.Query("SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3,
6248 // 11 12 13 14
6249 // itemcount4, itemcount5, itemcount6, playercount FROM character_queststatus WHERE guid = '{}'", GetGUID().GetCounter());
6250
6251 if (result)
6252 {
6253 do
6254 {
6255 Field* fields = result->Fetch();
6256
6257 uint32 quest_id = fields[0].Get<uint32>();
6258 // used to be new, no delete?
6259 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6260 if (quest)
6261 {
6262 // find or create
6263 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
6264
6265 uint8 qstatus = fields[1].Get<uint8>();
6266 if (qstatus < MAX_QUEST_STATUS)
6267 questStatusData.Status = QuestStatus(qstatus);
6268 else
6269 {
6270 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
6271 LOG_ERROR("entities.player", "Player {} ({}) has invalid quest {} status ({}), replaced by QUEST_STATUS_INCOMPLETE(3).",
6272 GetName(), GetGUID().ToString(), quest_id, qstatus);
6273 }
6274
6275 questStatusData.Explored = (fields[2].Get<uint8>() > 0);
6276
6277 time_t quest_time = time_t(fields[3].Get<uint32>());
6278
6279 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id))
6280 {
6281 AddTimedQuest(quest_id);
6282
6283 if (quest_time <= GameTime::GetGameTime().count())
6284 questStatusData.Timer = 1;
6285 else
6286 questStatusData.Timer = uint32((quest_time - GameTime::GetGameTime().count()) * IN_MILLISECONDS);
6287 }
6288 else
6289 quest_time = 0;
6290
6291 for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
6292 questStatusData.CreatureOrGOCount[i] = fields[4 + i].Get<uint16>();
6293
6294 for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
6295 questStatusData.ItemCount[i] = fields[8 + i].Get<uint16>();
6296
6297 questStatusData.PlayerCount = fields[14].Get<uint16>();
6298
6299 // add to quest log
6300 if (slot < MAX_QUEST_LOG_SIZE && questStatusData.Status != QUEST_STATUS_NONE)
6301 {
6302 SetQuestSlot(slot, quest_id, uint32(quest_time)); // cast can't be helped
6303
6304 if (questStatusData.Status == QUEST_STATUS_COMPLETE)
6306 else if (questStatusData.Status == QUEST_STATUS_FAILED)
6308
6309 for (uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx)
6310 if (questStatusData.CreatureOrGOCount[idx])
6311 SetQuestSlotCounter(slot, idx, questStatusData.CreatureOrGOCount[idx]);
6312
6313 if (questStatusData.PlayerCount)
6314 SetQuestSlotCounter(slot, QUEST_PVP_KILL_SLOT, questStatusData.PlayerCount);
6315
6316 ++slot;
6317 }
6318
6319 LOG_DEBUG("entities.player.loading", "Quest status is {{}} for quest {{}} for player ({})", questStatusData.Status, quest_id, GetGUID().ToString());
6320 }
6321 } while (result->NextRow());
6322 }
6323
6324 // clear quest log tail
6325 for (uint16 i = slot; i < MAX_QUEST_LOG_SIZE; ++i)
6326 SetQuestSlot(i, 0);
6327}
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition: QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition: QuestDef.h:35
#define MAX_QUEST_LOG_SIZE
Definition: QuestDef.h:33
#define QUEST_PVP_KILL_SLOT
Definition: QuestDef.h:43
QuestStatus
Definition: QuestDef.h:99
@ QUEST_STATUS_FAILED
Definition: QuestDef.h:105
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:103
@ QUEST_STATUS_NONE
Definition: QuestDef.h:100
@ MAX_QUEST_STATUS
Definition: QuestDef.h:107
@ QUEST_STATUS_COMPLETE
Definition: QuestDef.h:101
@ QUEST_SPECIAL_FLAGS_TIMED
Definition: QuestDef.h:177
@ QUEST_STATE_COMPLETE
Definition: Player.h:633
@ QUEST_STATE_FAIL
Definition: Player.h:634
QuestStatusMap m_QuestStatus
Definition: Player.h:2760
bool GetQuestRewardStatus(uint32 quest_id) const
Definition: PlayerQuest.cpp:1409
void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
Definition: Player.h:1485
void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer=0)
Definition: Player.h:1477
void SetQuestSlotState(uint16 slot, uint32 state)
Definition: Player.h:1492
void AddTimedQuest(uint32 quest_id)
Definition: Player.h:1544
Definition: QuestDef.h:406
uint32 Timer
Definition: QuestDef.h:414
uint16 PlayerCount
Definition: QuestDef.h:417
uint16 ItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:415
QuestStatus Status
Definition: QuestDef.h:413
bool Explored
Definition: QuestDef.h:418
uint16 CreatureOrGOCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:416

References AddTimedQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), GetQuestRewardStatus(), IN_MILLISECONDS, QuestStatusData::ItemCount, LOG_DEBUG, LOG_ERROR, m_QuestStatus, MAX_QUEST_LOG_SIZE, MAX_QUEST_STATUS, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_PVP_KILL_SLOT, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_COMPLETE, QUEST_STATE_FAIL, QUEST_STATUS_COMPLETE, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SetQuestSlot(), SetQuestSlotCounter(), SetQuestSlotState(), sObjectMgr, QuestStatusData::Status, QuestStatusData::Timer, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadQuestStatusRewarded()

void Player::_LoadQuestStatusRewarded ( PreparedQueryResult  result)
protected
6330{
6331 // SELECT quest FROM character_queststatus_rewarded WHERE guid = ?
6332
6333 if (result)
6334 {
6335 m_RewardedQuests.rehash(result->GetRowCount());
6336 do
6337 {
6338 Field* fields = result->Fetch();
6339
6340 uint32 quest_id = fields[0].Get<uint32>();
6341 // used to be new, no delete?
6342 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6343 if (quest)
6344 {
6345 // learn rewarded spell if unknown
6347
6348 // set rewarded title if any
6349 if (quest->GetCharTitleId())
6350 {
6351 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
6352 SetTitle(titleEntry);
6353 }
6354
6355 if (quest->GetBonusTalents())
6356 m_questRewardTalentCount += quest->GetBonusTalents();
6357 }
6358
6359 m_RewardedQuests.insert(quest_id);
6360 } while (result->NextRow());
6361 }
6362}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
RewardedQuestSet m_RewardedQuests
Definition: Player.h:2763
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition: Player.cpp:13282
void learnQuestRewardedSpells()
Definition: Player.cpp:11931
Definition: DBCStructure.h:632

References Field::Get(), learnQuestRewardedSpells(), m_questRewardTalentCount, m_RewardedQuests, sCharTitlesStore, SetTitle(), and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadRandomBGStatus()

void Player::_LoadRandomBGStatus ( PreparedQueryResult  result)
protected
15667{
15668 if (result)
15669 m_IsBGRandomWinner = true;
15670}

References m_IsBGRandomWinner.

Referenced by LoadFromDB().

◆ _LoadSeasonalQuestStatus()

void Player::_LoadSeasonalQuestStatus ( PreparedQueryResult  result)
protected
6438{
6439 m_seasonalquests.clear();
6440
6441 if (result)
6442 {
6443 do
6444 {
6445 Field* fields = result->Fetch();
6446 uint32 quest_id = fields[0].Get<uint32>();
6447 uint32 event_id = fields[1].Get<uint32>();
6448 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6449 if (!quest)
6450 continue;
6451
6452 m_seasonalquests[event_id].insert(quest_id);
6453 LOG_DEBUG("entities.player.loading", "Seasonal quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6454 } while (result->NextRow());
6455 }
6456
6457 m_SeasonalQuestChanged = false;
6458}
SeasonalEventQuestMap m_seasonalquests
Definition: Player.h:2662

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_SeasonalQuestChanged, m_seasonalquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSkills()

void Player::_LoadSkills ( PreparedQueryResult  result)
protected
13620{
13621 // 0 1 2
13622 // SetQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '{}'", m_guid.GetCounter());
13623
13624 uint32 count = 0;
13625 std::unordered_map<uint32, uint32> loadedSkillValues;
13626 if (result)
13627 {
13628 do
13629 {
13630 Field* fields = result->Fetch();
13631 uint16 skill = fields[0].Get<uint16>();
13632 uint16 value = fields[1].Get<uint16>();
13633 uint16 max = fields[2].Get<uint16>();
13634
13635 SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass());
13636 if (!rcEntry)
13637 {
13638 LOG_ERROR("entities.player", "Character {} has skill {} that does not exist.", GetGUID().ToString(), skill);
13639 continue;
13640 }
13641
13642 // set fixed skill ranges
13643 switch (GetSkillRangeType(rcEntry))
13644 {
13645 case SKILL_RANGE_LANGUAGE: // 300..300
13646 value = max = 300;
13647 break;
13648 case SKILL_RANGE_MONO: // 1..1, grey monolite bar
13649 value = max = 1;
13650 break;
13651 case SKILL_RANGE_LEVEL:
13653 default:
13654 break;
13655 }
13656
13657 if (value == 0)
13658 {
13659 LOG_ERROR("entities.player", "Character {} has skill {} with value 0. Will be deleted.", GetGUID().ToString(), skill);
13660
13662
13663 stmt->SetData(0, GetGUID().GetCounter());
13664 stmt->SetData(1, skill);
13665
13666 CharacterDatabase.Execute(stmt);
13667
13668 continue;
13669 }
13670
13671 uint16 skillStep = 0;
13672 if (SkillTiersEntry const* skillTier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID))
13673 {
13674 for (uint32 i = 0; i < MAX_SKILL_STEP; ++i)
13675 {
13676 if (skillTier->Value[skillStep] == max)
13677 {
13678 skillStep = i + 1;
13679 break;
13680 }
13681 }
13682 }
13683
13684 SetUInt32Value(PLAYER_SKILL_INDEX(count), MAKE_PAIR32(skill, skillStep));
13685
13688
13689 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
13690
13691 loadedSkillValues[skill] = value;
13692
13693 ++count;
13694
13695 if (count >= PLAYER_MAX_SKILLS) // client limit
13696 {
13697 LOG_ERROR("entities.player", "Character {} has more than {} skills.", GetGUID().ToString(), PLAYER_MAX_SKILLS);
13698 break;
13699 }
13700 } while (result->NextRow());
13701 }
13702
13703 // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB
13704 for (auto& skill : loadedSkillValues)
13705 {
13706 learnSkillRewardedSpells(skill.first, skill.second);
13707 }
13708
13709 for (; count < PLAYER_MAX_SKILLS; ++count)
13710 {
13714 }
13715}
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition: DBCStores.cpp:895
DBCStorage< SkillTiersEntry > sSkillTiersStore(SkillTiersfmt)
SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const *rcEntry)
Definition: ObjectMgr.cpp:8806
@ SKILL_RANGE_MONO
Definition: ObjectMgr.h:676
@ SKILL_RANGE_LANGUAGE
Definition: ObjectMgr.h:674
@ SKILL_RANGE_LEVEL
Definition: ObjectMgr.h:675
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition: ObjectDefines.h:87
#define PLAYER_SKILL_BONUS_INDEX(x)
Definition: Player.h:80
#define PLAYER_SKILL_VALUE_INDEX(x)
Definition: Player.h:79
#define PLAYER_SKILL_INDEX(x)
Definition: Player.h:78
#define PLAYER_MAX_SKILLS
Definition: Player.h:70
@ SKILL_UNCHANGED
Definition: Player.h:639
#define MAKE_SKILL_VALUE(v, m)
Definition: Player.h:84
@ CHAR_DEL_CHARACTER_SKILL
Definition: CharacterDatabase.h:316
#define MAX_SKILL_STEP
Definition: DBCStructure.h:1580
Definition: Player.h:646
SkillStatusMap mSkillStatus
Definition: Player.h:2767
void learnSkillRewardedSpells(uint32 id, uint32 value)
Definition: Player.cpp:11944
Definition: DBCStructure.h:1569
Definition: DBCStructure.h:1615

References CHAR_DEL_CHARACTER_SKILL, CharacterDatabase, Field::Get(), Unit::getClass(), Object::GetGUID(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, MAX_SKILL_STEP, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), Unit::SetUInt32Value(), SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_UNCHANGED, sSkillTiersStore, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpellCooldowns()

void Player::_LoadSpellCooldowns ( PreparedQueryResult  result)
3567{
3568 // some cooldowns can be already set at aura loading...
3569
3570 //QueryResult* result = CharacterDatabase.Query("SELECT spell, category, item, time FROM character_spell_cooldown WHERE guid = '{}'", GetGUID().GetCounter()());
3571
3572 if (result)
3573 {
3574 time_t curTime = GameTime::GetGameTime().count();
3575
3576 do
3577 {
3578 Field* fields = result->Fetch();
3579 uint32 spell_id = fields[0].Get<uint32>();
3580 uint16 category = fields[1].Get<uint16>();
3581 uint32 item_id = fields[2].Get<uint32>();
3582 uint32 db_time = fields[3].Get<uint32>();
3583 bool needSend = fields[4].Get<bool>();
3584
3585 if (!sSpellMgr->GetSpellInfo(spell_id))
3586 {
3587 LOG_ERROR("entities.player", "Player {} has unknown spell {} in `character_spell_cooldown`, skipping.", GetGUID().ToString(), spell_id);
3588 continue;
3589 }
3590
3591 // skip outdated cooldown
3592 if (db_time <= curTime)
3593 continue;
3594
3595 _AddSpellCooldown(spell_id, category, item_id, (db_time - curTime) * IN_MILLISECONDS, needSend);
3596
3597 LOG_DEBUG("entities.player.loading", "Player ({}) spell {}, item {} cooldown loaded ({} secs).", GetGUID().ToString(), spell_id, item_id, uint32(db_time - curTime));
3598 } while (result->NextRow());
3599 }
3600}
void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Player.cpp:11019

References _AddSpellCooldown(), Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, sSpellMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpells()

void Player::_LoadSpells ( PreparedQueryResult  result)
protected
6483{
6484 //QueryResult* result = CharacterDatabase.Query("SELECT spell, specMask FROM character_spell WHERE guid = '{}'", GetGUID().GetCounter());
6485
6486 if (result)
6487 {
6488 do
6489 // xinef: checked
6490 addSpell((*result)[0].Get<uint32>(), (*result)[1].Get<uint8>(), true);
6491 while (result->NextRow());
6492 }
6493}
bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3035

References addSpell().

Referenced by LoadFromDB().

◆ _LoadTalents()

void Player::_LoadTalents ( PreparedQueryResult  result)
protected
14954{
14955 // SetQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = '{}'", m_guid.GetCounter());
14956 if (result)
14957 {
14958 do
14959 {
14960 // xinef: checked
14961 uint32 spellId = (*result)[0].Get<uint32>();
14962 uint8 specMask = (*result)[1].Get<uint8>();
14963 addTalent(spellId, specMask, 0);
14964 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
14965 ASSERT(talentPos);
14966
14967 // xinef: increase used talent points count
14968 if (GetActiveSpecMask() & specMask)
14969 m_usedTalentCount += talentPos->rank + 1;
14970 } while (result->NextRow());
14971 }
14972}
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition: DBCStores.cpp:677
#define ASSERT
Definition: Errors.h:68
bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
Definition: Player.cpp:2890
uint8 GetActiveSpecMask() const
Definition: Player.h:1721
Definition: DBCStructure.h:2232
uint8 rank
Definition: DBCStructure.h:2237

References addTalent(), ASSERT, GetActiveSpecMask(), GetTalentSpellPos(), m_usedTalentCount, and TalentSpellPos::rank.

Referenced by LoadFromDB().

◆ _LoadWeeklyQuestStatus()

void Player::_LoadWeeklyQuestStatus ( PreparedQueryResult  result)
protected
6416{
6417 m_weeklyquests.clear();
6418
6419 if (result)
6420 {
6421 do
6422 {
6423 Field* fields = result->Fetch();
6424 uint32 quest_id = fields[0].Get<uint32>();
6425 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6426 if (!quest)
6427 continue;
6428
6429 m_weeklyquests.insert(quest_id);
6430 LOG_DEBUG("entities.player.loading", "Weekly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6431 } while (result->NextRow());
6432 }
6433
6434 m_WeeklyQuestChanged = false;
6435}
QuestSet m_weeklyquests
Definition: Player.h:2660

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_WeeklyQuestChanged, m_weeklyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _RemoveAllItemMods()

void Player::_RemoveAllItemMods ( )
7471{
7472 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods start.");
7473
7474 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7475 {
7476 if (m_items[i])
7477 {
7478 ItemTemplate const* proto = m_items[i]->GetTemplate();
7479 if (!proto)
7480 continue;
7481
7482 // item set bonuses not dependent from item broken state
7483 if (proto->ItemSet)
7484 RemoveItemsSetItem(this, proto);
7485
7486 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7487 continue;
7488
7489 ApplyItemEquipSpell(m_items[i], false);
7490 ApplyEnchantment(m_items[i], false);
7491 }
7492 }
7493
7494 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7495 {
7496 if (m_items[i])
7497 {
7498 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7499 continue;
7500 ItemTemplate const* proto = m_items[i]->GetTemplate();
7501 if (!proto)
7502 continue;
7503
7504 uint32 attacktype = Player::GetAttackBySlot(i);
7505 if (attacktype < MAX_ATTACK)
7507
7508 _ApplyItemBonuses(proto, i, false);
7509
7510 if (i == EQUIPMENT_SLOT_RANGED)
7512 }
7513 }
7514
7515 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods complete.");
7516}
void RemoveItemsSetItem(Player *player, ItemTemplate const *proto)
Definition: Item.cpp:119

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_ATTACK, and RemoveItemsSetItem().

Referenced by _RemoveAllStatBonuses().

◆ _RemoveAllStatBonuses()

void Player::_RemoveAllStatBonuses ( )
992{
993 SetCanModifyStats(false);
994
997
998 SetCanModifyStats(true);
999
1001}
void _RemoveAllItemMods()
Definition: Player.cpp:7470
void _RemoveAllAuraStatMods()
Definition: Unit.cpp:5433

References Unit::_RemoveAllAuraStatMods(), _RemoveAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _removeTalent() [1/2]

void Player::_removeTalent ( PlayerTalentMap::iterator &  itr,
uint8  specMask 
)
2955{
2956 // xinef: remove spec mask from iterator
2957 itr->second->specMask &= ~specMask;
2958
2959 // xinef: if talent is not present in any spec - remove
2960 if (itr->second->specMask == 0)
2961 {
2962 if (itr->second->State == PLAYERSPELL_NEW)
2963 {
2964 delete itr->second;
2965 m_talents.erase(itr);
2966 return;
2967 }
2968 else
2969 itr->second->State = PLAYERSPELL_REMOVED;
2970 }
2971 // xinef: otherwise save changes to DB
2972 else if (itr->second->State != PLAYERSPELL_NEW)
2973 itr->second->State = PLAYERSPELL_CHANGED;
2974}

References m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, and PLAYERSPELL_REMOVED.

Referenced by _removeTalent(), addTalent(), and resetTalents().

◆ _removeTalent() [2/2]

void Player::_removeTalent ( uint32  spellId,
uint8  specMask 
)
2946{
2947 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2948 if (itr == m_talents.end() || itr->second->State == PLAYERSPELL_REMOVED)
2949 return;
2950
2951 _removeTalent(itr, specMask);
2952}
void _removeTalent(PlayerTalentMap::iterator &itr, uint8 specMask)
Definition: Player.cpp:2954

References _removeTalent(), m_talents, and PLAYERSPELL_REMOVED.

◆ _removeTalentAurasAndSpells()

void Player::_removeTalentAurasAndSpells ( uint32  spellId)
2977{
2978 RemoveOwnedAura(spellId);
2979
2980 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2981 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2982 {
2983 // pussywizard: remove pet auras
2984 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spellId, i))
2985 RemovePetAura(petSpell);
2986
2987 // pussywizard: remove all triggered auras
2988 if (spellInfo->Effects[i].TriggerSpell > 0)
2989 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
2990
2991 // xinef: remove temporary spells added by talent
2992 // xinef: recursively remove all learnt spells
2993 if (spellInfo->Effects[i].TriggerSpell > 0 && spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
2994 {
2995 removeSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
2996 _removeTalentAurasAndSpells(spellInfo->Effects[i].TriggerSpell);
2997 }
2998 }
2999}
void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
Definition: Player.cpp:3311
void _removeTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:2976
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4667
void RemovePetAura(PetAura const *petSpell)
Definition: Unit.cpp:17226
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4871
Definition: SpellMgr.h:470

References _removeTalentAurasAndSpells(), SpellInfo::Effects, MAX_SPELL_EFFECTS, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SPEC_MASK_ALL, SPELL_EFFECT_LEARN_SPELL, and sSpellMgr.

Referenced by _removeTalentAurasAndSpells(), ActivateSpec(), addTalent(), and resetTalents().

◆ _SaveActions()

void Player::_SaveActions ( CharacterDatabaseTransaction  trans)
protected
7150{
7151 CharacterDatabasePreparedStatement* stmt = nullptr;
7152
7153 for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
7154 {
7155 switch (itr->second.uState)
7156 {
7157 case ACTIONBUTTON_NEW:
7158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
7159 stmt->SetData(0, GetGUID().GetCounter());
7160 stmt->SetData(1, m_activeSpec);
7161 stmt->SetData(2, itr->first);
7162 stmt->SetData(3, itr->second.GetAction());
7163 stmt->SetData(4, uint8(itr->second.GetType()));
7164 trans->Append(stmt);
7165
7166 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7167 ++itr;
7168 break;
7170 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
7171 stmt->SetData(0, itr->second.GetAction());
7172 stmt->SetData(1, uint8(itr->second.GetType()));
7173 stmt->SetData(2, GetGUID().GetCounter());
7174 stmt->SetData(3, itr->first);
7175 stmt->SetData(4, m_activeSpec);
7176 trans->Append(stmt);
7177
7178 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7179 ++itr;
7180 break;
7182 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
7183 stmt->SetData(0, GetGUID().GetCounter());
7184 stmt->SetData(1, itr->first);
7185 stmt->SetData(2, m_activeSpec);
7186 trans->Append(stmt);
7187
7188 m_actionButtons.erase(itr++);
7189 break;
7190 default:
7191 ++itr;
7192 break;
7193 }
7194 }
7195}
@ ACTIONBUTTON_NEW
Definition: Player.h:223
@ ACTIONBUTTON_CHANGED
Definition: Player.h:222
@ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC
Definition: CharacterDatabase.h:429
@ CHAR_UPD_CHAR_ACTION
Definition: CharacterDatabase.h:428
@ CHAR_INS_CHAR_ACTION
Definition: CharacterDatabase.h:427

References ACTIONBUTTON_CHANGED, ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, ACTIONBUTTON_UNCHANGED, CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, CHAR_INS_CHAR_ACTION, CHAR_UPD_CHAR_ACTION, CharacterDatabase, Object::GetGUID(), m_actionButtons, m_activeSpec, and PreparedStatementBase::SetData().

Referenced by ActivateSpec(), SaveToDB(), and UpdateSpecCount().

◆ _SaveAuras()

void Player::_SaveAuras ( CharacterDatabaseTransaction  trans,
bool  logout 
)
protected
7198{
7200 stmt->SetData(0, GetGUID().GetCounter());
7201 trans->Append(stmt);
7202
7203 for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
7204 {
7205 if (!itr->second->CanBeSaved())
7206 continue;
7207
7208 Aura* aura = itr->second;
7209 if( !logout && aura->GetDuration() < 60 * IN_MILLISECONDS )
7210 continue;
7211
7212 int32 damage[MAX_SPELL_EFFECTS];
7213 int32 baseDamage[MAX_SPELL_EFFECTS];
7214 uint8 effMask = 0;
7215 uint8 recalculateMask = 0;
7216 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
7217 {
7218 if (AuraEffect const* effect = aura->GetEffect(i))
7219 {
7220 baseDamage[i] = effect->GetBaseAmount();
7221 damage[i] = effect->GetAmount();
7222 effMask |= 1 << i;
7223 if (effect->CanBeRecalculated())
7224 recalculateMask |= 1 << i;
7225 }
7226 else
7227 {
7228 baseDamage[i] = 0;
7229 damage[i] = 0;
7230 }
7231 }
7232
7233 uint8 index = 0;
7234 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
7235 stmt->SetData(index++, GetGUID().GetCounter());
7236 stmt->SetData(index++, itr->second->GetCasterGUID().GetRawValue());
7237 stmt->SetData(index++, itr->second->GetCastItemGUID().GetRawValue());
7238 stmt->SetData(index++, itr->second->GetId());
7239 stmt->SetData(index++, effMask);
7240 stmt->SetData(index++, recalculateMask);
7241 stmt->SetData(index++, itr->second->GetStackAmount());
7242 stmt->SetData(index++, damage[0]);
7243 stmt->SetData(index++, damage[1]);
7244 stmt->SetData(index++, damage[2]);
7245 stmt->SetData(index++, baseDamage[0]);
7246 stmt->SetData(index++, baseDamage[1]);
7247 stmt->SetData(index++, baseDamage[2]);
7248 stmt->SetData(index++, itr->second->GetMaxDuration());
7249 stmt->SetData(index++, itr->second->GetDuration());
7250 stmt->SetData(index, itr->second->GetCharges());
7251 trans->Append(stmt);
7252 }
7253}
@ CHAR_INS_AURA
Definition: CharacterDatabase.h:196
@ CHAR_DEL_CHAR_AURA
Definition: CharacterDatabase.h:404
AuraMap m_ownedAuras
Definition: Unit.h:1846
Definition: SpellAuraEffects.h:39
int32 GetDuration() const
Definition: SpellAuras.h:133
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References CHAR_DEL_CHAR_AURA, CHAR_INS_AURA, CharacterDatabase, Aura::GetDuration(), Aura::GetEffect(), Object::GetGUID(), IN_MILLISECONDS, Unit::m_ownedAuras, MAX_SPELL_EFFECTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB(), and SpawnCorpseBones().

◆ _SaveCharacter()

void Player::_SaveCharacter ( bool  create,
CharacterDatabaseTransaction  trans 
)
protected

Insert query TO DO: Filter out more redundant fields that can take their default value at player create

14629{
14630 CharacterDatabasePreparedStatement* stmt = nullptr;
14631 uint8 index = 0;
14632
14633 auto finiteAlways = [](float f) { return std::isfinite(f) ? f : 0.0f; };
14634
14635 if (create)
14636 {
14639 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
14640 stmt->SetData(index++, GetGUID().GetCounter());
14641 stmt->SetData(index++, GetSession()->GetAccountId());
14642 stmt->SetData(index++, GetName());
14643 stmt->SetData(index++, getRace(true));
14644 stmt->SetData(index++, getClass());
14645 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14646 stmt->SetData(index++, GetLevel());
14647 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14648 stmt->SetData(index++, GetMoney());
14649 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14650 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14651 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14652 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14653 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14654 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14655 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14656 stmt->SetData(index++, (uint32)GetPlayerFlags());
14657 stmt->SetData(index++, (uint16)GetMapId());
14658 stmt->SetData(index++, (uint32)GetInstanceId());
14659 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14660 stmt->SetData(index++, finiteAlways(GetPositionX()));
14661 stmt->SetData(index++, finiteAlways(GetPositionY()));
14662 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14663 stmt->SetData(index++, finiteAlways(GetOrientation()));
14664 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14665 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14666 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14667 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14668
14669 int32 lowGuidOrSpawnId = 0;
14670 if (Transport* transport = GetTransport())
14671 {
14672 if (transport->IsMotionTransport())
14673 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14674 else if (transport->IsStaticTransport())
14675 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14676 }
14677 stmt->SetData(index++, lowGuidOrSpawnId);
14678
14679 std::ostringstream ss;
14680 ss << m_taxi;
14681 stmt->SetData(index++, ss.str());
14682 stmt->SetData(index++, m_cinematic);
14683 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14684 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14685 stmt->SetData(index++, finiteAlways(_restBonus));
14686 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14687 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14688 //save, far from tavern/city
14689 //save, but in tavern/city
14690 stmt->SetData(index++, m_resetTalentsCost);
14691 stmt->SetData(index++, uint32(m_resetTalentsTime));
14692 stmt->SetData(index++, (uint16)m_ExtraFlags);
14693 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14694 stmt->SetData(index++, (uint16)m_atLoginFlags);
14695 stmt->SetData(index++, GetZoneId());
14696 stmt->SetData(index++, uint32(m_deathExpireTime));
14697
14698 ss.str("");
14700
14701 stmt->SetData(index++, ss.str());
14702 stmt->SetData(index++, GetArenaPoints());
14703 stmt->SetData(index++, GetHonorPoints());
14707 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14708 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14712 stmt->SetData(index++, GetDrunkValue());
14713 stmt->SetData(index++, GetHealth());
14714
14715 for (uint32 i = 0; i < MAX_POWERS; ++i)
14716 stmt->SetData(index++, GetPower(Powers(i)));
14717
14718 stmt->SetData(index++, GetSession()->GetLatency());
14719
14720 stmt->SetData(index++, m_specsCount);
14721 stmt->SetData(index++, m_activeSpec);
14722
14723 ss.str("");
14724 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14725 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14726 stmt->SetData(index++, ss.str());
14727
14728 ss.str("");
14729 // cache equipment...
14730 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14732
14733 // ...and bags for enum opcode
14735 {
14736 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14737 ss << item->GetEntry();
14738 else
14739 ss << '0';
14740 ss << " 0 ";
14741 }
14742
14743 stmt->SetData(index++, ss.str());
14744 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14745
14746 ss.str("");
14747 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14749
14750 stmt->SetData(index++, ss.str());
14751 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14752 stmt->SetData(index++, m_grantableLevels);
14753 stmt->SetData(index++, _innTriggerId);
14754 stmt->SetData(index++, m_extraBonusTalentCount);
14755 }
14756 else
14757 {
14758 // Update query
14759 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
14760 stmt->SetData(index++, GetName());
14761 stmt->SetData(index++, getRace(true));
14762 stmt->SetData(index++, getClass());
14763 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14764 stmt->SetData(index++, GetLevel());
14765 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14766 stmt->SetData(index++, GetMoney());
14767 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14768 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14769 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14770 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14771 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14772 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14773 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14774 stmt->SetData(index++, GetPlayerFlags());
14775
14776 if (!IsBeingTeleported())
14777 {
14779 if (Map* m = FindMap())
14780 if (m->IsDungeon())
14781 {
14782 if (m->IsNonRaidDungeon()) dd = m->GetDifficulty();
14783 else rd = m->GetDifficulty();
14784 }
14785 stmt->SetData(index++, (uint16)GetMapId());
14786 stmt->SetData(index++, (uint32)GetInstanceId());
14787 stmt->SetData(index++, (uint8(dd) | uint8(rd) << 4));
14788 stmt->SetData(index++, finiteAlways(GetPositionX()));
14789 stmt->SetData(index++, finiteAlways(GetPositionY()));
14790 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14791 stmt->SetData(index++, finiteAlways(GetOrientation()));
14792 }
14793 else
14794 {
14795 stmt->SetData(index++, (uint16)GetTeleportDest().GetMapId());
14796 stmt->SetData(index++, (uint32)0);
14797 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14798 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionX()));
14799 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionY()));
14800 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionZ()));
14801 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetOrientation()));
14802 }
14803
14804 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14805 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14806 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14807 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14808
14809 int32 lowGuidOrSpawnId = 0;
14810 if (Transport* transport = GetTransport())
14811 {
14812 if (transport->IsMotionTransport())
14813 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14814 else if (transport->IsStaticTransport())
14815 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14816 }
14817 stmt->SetData(index++, lowGuidOrSpawnId);
14818
14819 std::ostringstream ss;
14820 ss << m_taxi;
14821 stmt->SetData(index++, ss.str());
14822 stmt->SetData(index++, m_cinematic);
14823 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14824 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14825 stmt->SetData(index++, finiteAlways(_restBonus));
14826 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14827 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14828 //save, far from tavern/city
14829 //save, but in tavern/city
14830 stmt->SetData(index++, m_resetTalentsCost);
14831 stmt->SetData(index++, uint32(m_resetTalentsTime));
14832 stmt->SetData(index++, (uint16)m_ExtraFlags);
14833 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14834 stmt->SetData(index++, (uint16)m_atLoginFlags);
14835 stmt->SetData(index++, GetZoneId());
14836 stmt->SetData(index++, uint32(m_deathExpireTime));
14837
14838 ss.str("");
14840
14841 stmt->SetData(index++, ss.str());
14842 stmt->SetData(index++, GetArenaPoints());
14843 stmt->SetData(index++, GetHonorPoints());
14847 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14848 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14852 stmt->SetData(index++, GetDrunkValue());
14853 stmt->SetData(index++, GetHealth());
14854
14855 for (uint32 i = 0; i < MAX_POWERS; ++i)
14856 stmt->SetData(index++, GetPower(Powers(i)));
14857
14858 stmt->SetData(index++, GetSession()->GetLatency());
14859
14860 stmt->SetData(index++, m_specsCount);
14861 stmt->SetData(index++, m_activeSpec);
14862
14863 ss.str("");
14864 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14865 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14866 stmt->SetData(index++, ss.str());
14867
14868 ss.str("");
14869 // cache equipment...
14870 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14872
14873 // ...and bags for enum opcode
14875 {
14876 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14877 ss << item->GetEntry();
14878 else
14879 ss << '0';
14880 ss << " 0 ";
14881 }
14882
14883 stmt->SetData(index++, ss.str());
14884 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14885
14886 ss.str("");
14887 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14889
14890 stmt->SetData(index++, ss.str());
14891 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14892 stmt->SetData(index++, m_grantableLevels);
14893 stmt->SetData(index++, _innTriggerId);
14894 stmt->SetData(index++, m_extraBonusTalentCount);
14895
14896 stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
14897 // Index
14898 stmt->SetData(index++, GetGUID().GetCounter());
14899 }
14900
14901 trans->Append(stmt);
14902}
@ PLAYER_FIELD_TODAY_CONTRIBUTION
Definition: UpdateFields.h:375
@ PLAYER_BYTES_3
Definition: UpdateFields.h:183
@ PLAYER_XP
Definition: UpdateFields.h:339
@ PLAYER_CHOSEN_TITLE
Definition: UpdateFields.h:324
@ PLAYER_EXPLORED_ZONES_1
Definition: UpdateFields.h:357
@ PLAYER_FIELD_KNOWN_CURRENCIES
Definition: UpdateFields.h:338
@ PLAYER_BYTES_2
Definition: UpdateFields.h:182
@ PLAYER__FIELD_KNOWN_TITLES
Definition: UpdateFields.h:335
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ PLAYER_FIELD_KILLS
Definition: UpdateFields.h:374
@ PLAYER_FIELD_YESTERDAY_CONTRIBUTION
Definition: UpdateFields.h:376
@ PLAYER_FIELD_WATCHED_FACTION_INDEX
Definition: UpdateFields.h:379
@ PLAYER_VISIBLE_ITEM_1_ENTRYID
Definition: UpdateFields.h:286
@ PLAYER_FIELD_LIFETIME_HONORABLE_KILLS
Definition: UpdateFields.h:377
@ PLAYER_FIELD_BYTES
Definition: UpdateFields.h:368
#define KNOWN_TITLES_SIZE
Definition: Player.h:553
@ PLAYER_FLAGS_RESTING
Definition: Player.h:479
@ INVENTORY_SLOT_BAG_START
Definition: Player.h:699
#define PLAYER_EXPLORED_ZONES_SIZE
Definition: Player.h:72
@ CHAR_INS_CHARACTER
Definition: CharacterDatabase.h:271
@ CHAR_UPD_CHARACTER
Definition: CharacterDatabase.h:272
Difficulty
Definition: DBCEnums.h:266
Powers
Definition: SharedDefines.h:268
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323
uint16 GetUInt16Value(uint16 index, uint8 offset) const
Definition: Object.cpp:330
uint64 GetUInt64Value(uint16 index) const
Definition: Object.cpp:311
float GetTransOffsetX() const
Definition: Object.h:598
uint32 GetInstanceId() const
Definition: Object.h:441
float GetTransOffsetY() const
Definition: Object.h:599
float GetTransOffsetZ() const
Definition: Object.h:600
Transport * GetTransport() const
Definition: Object.h:597
float GetTransOffsetO() const
Definition: Object.h:601
float GetPositionZ() const
Definition: Position.h:119
float GetOrientation() const
Definition: Position.h:120
float GetPositionX() const
Definition: Position.h:117
float GetPositionY() const
Definition: Position.h:118
Difficulty GetRaidDifficulty() const
Definition: Player.h:1898
WorldLocation & GetTeleportDest()
Definition: Player.h:2065
uint32 GetArenaPoints() const
Definition: Player.h:2129
uint8 GetDrunkValue() const
Definition: Player.h:2147
Item * GetItemByPos(uint16 pos) const
Definition: PlayerStorage.cpp:464
uint32 GetHonorPoints() const
Definition: Player.h:2128
PlayerFlags GetPlayerFlags() const
Definition: Player.h:1106
uint32 GetMoney() const
Definition: Player.h:1592
PlayerTaxi m_taxi
Definition: Player.h:1142
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1107
Difficulty GetDungeonDifficulty() const
Definition: Player.h:1897
bool IsBeingTeleported() const
Definition: Player.h:2066
std::string SaveTaxiDestinationsToString()
Definition: PlayerTaxi.cpp:193
Definition: Transport.h:29
uint32 GetHealth() const
Definition: Unit.h:782
uint32 GetPower(Powers power) const
Definition: Unit.h:804
Definition: Map.h:313
bool PlayerLogout() const
Definition: WorldSession.h:338
uint32 GetLatency() const
Definition: WorldSession.h:502

References _innTriggerId, _restBonus, CHAR_INS_CHARACTER, CHAR_UPD_CHARACTER, CharacterDatabase, EQUIPMENT_SLOT_END, WorldObject::FindMap(), GetArenaPoints(), Object::GetByteValue(), Unit::getClass(), ObjectGuid::GetCounter(), GetDrunkValue(), GetDungeonDifficulty(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealth(), GetHonorPoints(), WorldObject::GetInstanceId(), GetItemByPos(), WorldSession::GetLatency(), Unit::GetLevel(), WorldLocation::GetMapId(), GetMoney(), WorldObject::GetName(), Position::GetOrientation(), GetPlayerFlags(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetPower(), Unit::getRace(), GetRaidDifficulty(), GetSession(), GetTeleportDest(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), Object::GetUInt16Value(), Object::GetUInt32Value(), Object::GetUInt64Value(), WorldObject::GetZoneId(), HasPlayerFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, IsBeingTeleported(), Object::IsInWorld(), KNOWN_TITLES_SIZE, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, m_extraBonusTalentCount, m_ExtraFlags, m_grantableLevels, m_petStable, m_Played_time, m_resetTalentsCost, m_resetTalentsTime, m_specsCount, m_taxi, MAX_POWERS, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_FIELD_BYTES, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_RESTING, PLAYER_VISIBLE_ITEM_1_ENTRYID, PLAYER_XP, WorldSession::PlayerLogout(), PlayerTaxi::SaveTaxiDestinationsToString(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveDailyQuestStatus()

void Player::_SaveDailyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7536{
7538 return;
7539
7540 m_DailyQuestChanged = false;
7541
7542 // save last daily quest time for all quests: we need only mostly reset time for reset check anyway
7543
7544 // we don't need transactions here.
7546 stmt->SetData(0, GetGUID().GetCounter());
7547 trans->Append(stmt);
7548 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
7549 {
7550 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
7551 {
7552 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7553 stmt->SetData(0, GetGUID().GetCounter());
7554 stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
7556 trans->Append(stmt);
7557 }
7558 }
7559
7560 if (!m_DFQuests.empty())
7561 {
7562 for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
7563 {
7564 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7565 stmt->SetData(0, GetGUID().GetCounter());
7566 stmt->SetData(1, (*itr));
7568 trans->Append(stmt);
7569 }
7570 }
7571}
@ CHAR_DEL_QUEST_STATUS_DAILY_CHAR
Definition: CharacterDatabase.h:59
@ CHAR_INS_CHARACTER_DAILYQUESTSTATUS
Definition: CharacterDatabase.h:74

References CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_INS_CHARACTER_DAILYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveEntryPoint()

void Player::_SaveEntryPoint ( CharacterDatabaseTransaction  trans)
protected
14546{
14547 // xinef: dont save joinpos with invalid mapid
14548 MapEntry const* mEntry = sMapStore.LookupEntry(m_entryPointData.joinPos.GetMapId());
14549 if (!mEntry)
14550 return;
14551
14553 stmt->SetData(0, GetGUID().GetCounter());
14554 trans->Append(stmt);
14555
14556 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
14557 stmt->SetData(0, GetGUID().GetCounter());
14563 stmt->SetData(6, m_entryPointData.taxiPath[0]);
14564 stmt->SetData(7, m_entryPointData.taxiPath[1]);
14566 trans->Append(stmt);
14567}
@ CHAR_INS_PLAYER_ENTRY_POINT
Definition: CharacterDatabase.h:237
@ CHAR_DEL_PLAYER_ENTRY_POINT
Definition: CharacterDatabase.h:238

References CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_INS_PLAYER_ENTRY_POINT, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, PreparedStatementBase::SetData(), sMapStore, and EntryPointData::taxiPath.

Referenced by SaveToDB().

◆ _SaveEquipmentSets()

void Player::_SaveEquipmentSets ( CharacterDatabaseTransaction  trans)
protected
14495{
14496 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
14497 {
14498 uint32 index = itr->first;
14499 EquipmentSet& eqset = itr->second;
14500 CharacterDatabasePreparedStatement* stmt = nullptr;
14501 uint8 j = 0;
14502 switch (eqset.state)
14503 {
14505 ++itr;
14506 break; // nothing do
14508 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
14509 stmt->SetData(j++, eqset.Name.c_str());
14510 stmt->SetData(j++, eqset.IconName.c_str());
14511 stmt->SetData(j++, eqset.IgnoreMask);
14512 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14513 stmt->SetData(j++, eqset.Items[i].GetCounter());
14514 stmt->SetData(j++, GetGUID().GetCounter());
14515 stmt->SetData(j++, eqset.Guid);
14516 stmt->SetData(j, index);
14517 trans->Append(stmt);
14519 ++itr;
14520 break;
14521 case EQUIPMENT_SET_NEW:
14522 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
14523 stmt->SetData(j++, GetGUID().GetCounter());
14524 stmt->SetData(j++, eqset.Guid);
14525 stmt->SetData(j++, index);
14526 stmt->SetData(j++, eqset.Name.c_str());
14527 stmt->SetData(j++, eqset.IconName.c_str());
14528 stmt->SetData(j++, eqset.IgnoreMask);
14529 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14530 stmt->SetData(j++, eqset.Items[i].GetCounter());
14531 trans->Append(stmt);
14533 ++itr;
14534 break;
14536 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
14537 stmt->SetData(0, eqset.Guid);
14538 trans->Append(stmt);
14539 m_EquipmentSets.erase(itr++);
14540 break;
14541 }
14542 }
14543}
@ EQUIPMENT_SET_CHANGED
Definition: Player.h:743
@ EQUIPMENT_SET_DELETED
Definition: Player.h:745
@ EQUIPMENT_SET_NEW
Definition: Player.h:744
@ CHAR_UPD_EQUIP_SET
Definition: CharacterDatabase.h:192
@ CHAR_INS_EQUIP_SET
Definition: CharacterDatabase.h:193
@ CHAR_DEL_EQUIP_SET
Definition: CharacterDatabase.h:194

References CHAR_DEL_EQUIP_SET, CHAR_INS_EQUIP_SET, CHAR_UPD_EQUIP_SET, CharacterDatabase, EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, ObjectGuid::GetCounter(), Object::GetGUID(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, EquipmentSet::Name, PreparedStatementBase::SetData(), and EquipmentSet::state.

Referenced by SaveToDB().

◆ _SaveGlyphs()

void Player::_SaveGlyphs ( CharacterDatabaseTransaction  trans)
protected
14928{
14929 if (!NeedToSaveGlyphs())
14930 return;
14931
14933 stmt->SetData(0, GetGUID().GetCounter());
14934 trans->Append(stmt);
14935
14936 for (uint8 spec = 0; spec < m_specsCount; ++spec)
14937 {
14938 uint8 index = 0;
14939
14940 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
14941 stmt->SetData(index++, GetGUID().GetCounter());
14942 stmt->SetData(index++, spec);
14943
14944 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14945 stmt->SetData(index++, uint16(m_Glyphs[spec][i]));
14946
14947 trans->Append(stmt);
14948 }
14949
14950 SetNeedToSaveGlyphs(false);
14951}
@ CHAR_DEL_CHAR_GLYPHS
Definition: CharacterDatabase.h:417
@ CHAR_INS_CHAR_GLYPHS
Definition: CharacterDatabase.h:451
void SetNeedToSaveGlyphs(bool val)
Definition: Player.h:2578
bool NeedToSaveGlyphs()
Definition: Player.h:2577

References CHAR_DEL_CHAR_GLYPHS, CHAR_INS_CHAR_GLYPHS, CharacterDatabase, Object::GetGUID(), m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, NeedToSaveGlyphs(), PreparedStatementBase::SetData(), and SetNeedToSaveGlyphs().

Referenced by SaveToDB().

◆ _SaveInstanceTimeRestrictions()

void Player::_SaveInstanceTimeRestrictions ( CharacterDatabaseTransaction  trans)
protected
15821{
15822 if (_instanceResetTimes.empty())
15823 return;
15824
15826 stmt->SetData(0, GetSession()->GetAccountId());
15827 trans->Append(stmt);
15828
15829 for (InstanceTimeMap::const_iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end(); ++itr)
15830 {
15831 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES);
15832 stmt->SetData(0, GetSession()->GetAccountId());
15833 stmt->SetData(1, itr->first);
15834 stmt->SetData(2, (int64)itr->second);
15835 trans->Append(stmt);
15836 }
15837}
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:133
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:134
std::int64_t int64
Definition: Define.h:102

References _instanceResetTimes, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, CharacterDatabase, GetSession(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveInventory()

void Player::_SaveInventory ( CharacterDatabaseTransaction  trans)
protected
7256{
7257 CharacterDatabasePreparedStatement* stmt = nullptr;
7258 // force items in buyback slots to new state
7259 // and remove those that aren't already
7260 for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i)
7261 {
7262 Item* item = m_items[i];
7263 if (!item)
7264 continue;
7265
7266 if (item->GetState() == ITEM_NEW)
7267 {
7268 // Xinef: item is removed, remove loot from storage if any
7270 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7271 continue;
7272 }
7273
7274 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7275 stmt->SetData(0, item->GetGUID().GetCounter());
7276 trans->Append(stmt);
7277
7278 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7279 stmt->SetData(0, item->GetGUID().GetCounter());
7280 trans->Append(stmt);
7282
7283 // Xinef: item is removed, remove loot from storage if any
7285 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7286 }
7287
7288 // Updated played time for refundable items. We don't do this in Player::Update because there's simply no need for it,
7289 // the client auto counts down in real time after having received the initial played time on the first
7290 // SMSG_ITEM_REFUND_INFO_RESPONSE packet.
7291 // Item::UpdatePlayedTime is only called when needed, which is in DB saves, and item refund info requests.
7292 RefundableItemsSet::iterator i_next;
7293 for (RefundableItemsSet::iterator itr = m_refundableItems.begin(); itr != m_refundableItems.end(); itr = i_next)
7294 {
7295 // use copy iterator because itr may be invalid after operations in this loop
7296 i_next = itr;
7297 ++i_next;
7298
7299 Item* iPtr = GetItemByGuid((*itr));
7300 if (iPtr)
7301 {
7302 iPtr->UpdatePlayedTime(this);
7303 continue;
7304 }
7305 else
7306 {
7307 LOG_ERROR("entities.player", "Can't find item {} but is in refundable storage for player {} ! Removing.", (*itr).ToString(), GetGUID().ToString());
7308 m_refundableItems.erase(itr);
7309 }
7310 }
7311
7312 // update enchantment durations
7313 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
7314 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
7315
7316 // if no changes
7317 if (m_itemUpdateQueue.empty())
7318 return;
7319
7321 for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i)
7322 {
7323 Item* item = m_itemUpdateQueue[i];
7324 if (!item)
7325 continue;
7326
7327 Bag* container = item->GetContainer();
7328 ObjectGuid::LowType bag_guid = container ? container->GetGUID().GetCounter() : 0;
7329
7330 if (item->GetState() != ITEM_REMOVED)
7331 {
7332 Item* test = GetItemByPos(item->GetBagSlot(), item->GetSlot());
7333 if (!test)
7334 {
7335 ObjectGuid::LowType bagTestGUID = 0;
7336 if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot()))
7337 bagTestGUID = test2->GetGUID().GetCounter();
7338 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item {} (state {}) are incorrect, the player doesn't have an item at that position!",
7339 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
7340 // according to the test that was just performed nothing should be in this slot, delete
7341 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT);
7342 stmt->SetData(0, bagTestGUID);
7343 stmt->SetData(1, item->GetSlot());
7344 stmt->SetData(2, lowGuid);
7345 trans->Append(stmt);
7346
7347 RemoveTradeableItem(item); // pussywizard
7348 RemoveEnchantmentDurationsReferences(item); // pussywizard
7349 RemoveItemDurations(item); // pussywizard
7350
7351 // also THIS item should be somewhere else, cheat attempt
7352 item->FSetState(ITEM_REMOVED); // we are IN updateQueue right now, can't use SetState which modifies the queue
7354 // don't skip, let the switch delete it
7355 continue;
7356 }
7357 else if (test != item)
7358 {
7359 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item ({}) are incorrect, the item ({}) is there instead!",
7360 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
7361 // save all changes to the item...
7362 if (item->GetState() != ITEM_NEW) // only for existing items, no dupes
7363 item->SaveToDB(trans);
7364 // ...but do not save position in invntory
7365 continue;
7366 }
7367 }
7368
7369 switch (item->GetState())
7370 {
7371 case ITEM_NEW:
7372 case ITEM_CHANGED:
7373 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_INVENTORY_ITEM);
7374 stmt->SetData(0, lowGuid);
7375 stmt->SetData(1, bag_guid);
7376 stmt->SetData (2, item->GetSlot());
7377 stmt->SetData(3, item->GetGUID().GetCounter());
7378 trans->Append(stmt);
7379 break;
7380 case ITEM_REMOVED:
7381 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7382 stmt->SetData(0, item->GetGUID().GetCounter());
7383 trans->Append(stmt);
7384 case ITEM_UNCHANGED:
7385 break;
7386 }
7387
7388 item->SaveToDB(trans); // item have unchanged inventory record and can be save standalone
7389 }
7390 m_itemUpdateQueue.clear();
7391}
@ ITEM_CHANGED
Definition: Item.h:210
@ ITEM_NEW
Definition: Item.h:211
@ ITEM_FLAG_HAS_LOOT
Definition: ItemTemplate.h:149
@ BUYBACK_SLOT_END
Definition: Player.h:725
#define sLootItemStorage
Definition: LootItemStorage.h:75
@ CHAR_DEL_ITEM_INSTANCE
Definition: CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition: CharacterDatabase.h:430
@ CHAR_REP_INVENTORY_ITEM
Definition: CharacterDatabase.h:123
@ CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT
Definition: CharacterDatabase.h:431
uint8 GetSlot() const
Definition: Item.h:281
Bag * GetContainer()
Definition: Item.h:282
ItemUpdateState GetState() const
Definition: Item.h:324
void UpdatePlayedTime(Player *owner)
Definition: Item.cpp:1219
uint8 GetBagSlot() const
Definition: Item.cpp:785
bool HasFlag(ItemFlags flag) const
Definition: ItemTemplate.h:827
std::vector< Item * > m_itemUpdateQueue
Definition: Player.h:2755
void DeleteRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15462
void RemoveTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4154
EnchantDurationList m_enchantDuration
Definition: Player.h:2798
void RemoveItemDurations(Item *item)
Definition: Player.cpp:12394
void RemoveEnchantmentDurationsReferences(Item *item)
Definition: PlayerStorage.cpp:4229
RefundableItemsSet m_refundableItems
Definition: Player.h:2898
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:430

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_ITEM_INSTANCE, CHAR_REP_INVENTORY_ITEM, CharacterDatabase, DeleteRefundReference(), Item::FSetState(), Item::GetBagSlot(), Item::GetContainer(), ObjectGuid::GetCounter(), Object::GetGUID(), GetItemByGuid(), GetItemByPos(), WorldObject::GetName(), Item::GetSlot(), Item::GetState(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, ITEM_CHANGED, ITEM_FLAG_HAS_LOOT, ITEM_NEW, ITEM_REMOVED, ITEM_UNCHANGED, LOG_ERROR, m_enchantDuration, m_items, m_itemUpdateQueue, m_refundableItems, RemoveEnchantmentDurationsReferences(), RemoveItemDurations(), RemoveTradeableItem(), Item::SaveToDB(), PreparedStatementBase::SetData(), sLootItemStorage, ObjectGuid::ToString(), Position::ToString(), and Item::UpdatePlayedTime().

Referenced by SaveInventoryAndGoldToDB(), and SaveToDB().

◆ _SaveMail()

void Player::_SaveMail ( CharacterDatabaseTransaction  trans)
protected
7394{
7395 if (!GetMailSize() || !m_mailsUpdated)
7396 {
7397 return;
7398 }
7399
7400 CharacterDatabasePreparedStatement* stmt = nullptr;
7401
7402 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
7403 {
7404 Mail* m = (*itr);
7405 if (m->state == MAIL_STATE_CHANGED)
7406 {
7407 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL);
7408 stmt->SetData(0, uint8(m->HasItems() ? 1 : 0));
7409 stmt->SetData(1, uint32(m->expire_time));
7410 stmt->SetData(2, uint32(m->deliver_time));
7411 stmt->SetData(3, m->money);
7412 stmt->SetData(4, m->COD);
7413 stmt->SetData(5, uint8(m->checked));
7414 stmt->SetData(6, m->messageID);
7415
7416 trans->Append(stmt);
7417
7418 if (!m->removedItems.empty())
7419 {
7420 for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
7421 {
7422 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM);
7423 stmt->SetData(0, *itr2);
7424 trans->Append(stmt);
7425 }
7426 m->removedItems.clear();
7427 }
7429 }
7430 else if (m->state == MAIL_STATE_DELETED)
7431 {
7432 if (m->HasItems())
7433 {
7434 for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
7435 {
7436 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7437 stmt->SetData(0, itr2->item_guid);
7438 trans->Append(stmt);
7439 }
7440 }
7441 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
7442 stmt->SetData(0, m->messageID);
7443 trans->Append(stmt);
7444
7445 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
7446 stmt->SetData(0, m->messageID);
7447 trans->Append(stmt);
7448 }
7449 }
7450
7451 //deallocate deleted mails...
7452 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end();)
7453 {
7454 if ((*itr)->state == MAIL_STATE_DELETED)
7455 {
7456 Mail* m = *itr;
7457 m_mail.erase(itr);
7458 delete m;
7459 itr = m_mail.begin();
7460 }
7461 else
7462 ++itr;
7463 }
7464
7465 m_mailsUpdated = false;
7466}
@ MAIL_STATE_DELETED
Definition: Mail.h:71
@ MAIL_STATE_CHANGED
Definition: Mail.h:70
@ CHAR_UPD_MAIL
Definition: CharacterDatabase.h:432
@ CHAR_DEL_MAIL_BY_ID
Definition: CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition: CharacterDatabase.h:377
uint32 GetMailSize()
Definition: Player.h:1633
bool HasItems() const
Definition: Mail.h:207
std::vector< uint32 > removedItems
Definition: Mail.h:178
std::vector< MailItemInfo > items
Definition: Mail.h:177

References CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_UPD_MAIL, CharacterDatabase, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, GetMailSize(), Mail::HasItems(), Mail::items, m_mail, m_mailsUpdated, MAIL_STATE_CHANGED, MAIL_STATE_DELETED, MAIL_STATE_UNCHANGED, Mail::messageID, Mail::money, Mail::removedItems, PreparedStatementBase::SetData(), and Mail::state.

Referenced by WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and SaveToDB().

◆ _SaveMonthlyQuestStatus()

void Player::_SaveMonthlyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7631{
7632 if (!m_MonthlyQuestChanged || m_monthlyquests.empty())
7633 return;
7634
7635 // we don't need transactions here.
7637 stmt->SetData(0, GetGUID().GetCounter());
7638 trans->Append(stmt);
7639
7640 for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
7641 {
7642 uint32 quest_id = *iter;
7643 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
7644 stmt->SetData(0, GetGUID().GetCounter());
7645 stmt->SetData(1, quest_id);
7646 trans->Append(stmt);
7647 }
7648
7649 m_MonthlyQuestChanged = false;
7650}
@ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS
Definition: CharacterDatabase.h:76
@ CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR
Definition: CharacterDatabase.h:61

References CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_MonthlyQuestChanged, m_monthlyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SavePlayerSettings()

void Player::_SavePlayerSettings ( CharacterDatabaseTransaction  trans)
protected
92{
93 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
94 {
95 return;
96 }
97
98 for (auto& itr : m_charSettingsMap)
99 {
100 std::ostringstream data;
101
102 for (auto& setting : itr.second)
103 {
104 data << setting.value << ' ';
105 }
106
108 stmt->SetData(0, GetGUID().GetCounter());
109 stmt->SetData(1, itr.first);
110 stmt->SetData(2, data.str());
111 trans->Append(stmt);
112 }
113}
@ CHAR_REP_CHAR_SETTINGS
Definition: CharacterDatabase.h:516

References CHAR_REP_CHAR_SETTINGS, CharacterDatabase, CONFIG_PLAYER_SETTINGS_ENABLED, Object::GetGUID(), m_charSettingsMap, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveQuestStatus()

void Player::_SaveQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7469{
7470 bool isTransaction = static_cast<bool>(trans);
7471 if (!isTransaction)
7472 trans = CharacterDatabase.BeginTransaction();
7473
7474 QuestStatusSaveMap::iterator saveItr;
7475 QuestStatusMap::iterator statusItr;
7476 CharacterDatabasePreparedStatement* stmt = nullptr;
7477
7478 bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS);
7479
7480 for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr)
7481 {
7482 if (saveItr->second)
7483 {
7484 statusItr = m_QuestStatus.find(saveItr->first);
7485 if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE))
7486 {
7487 uint8 index = 0;
7488 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS);
7489
7490 stmt->SetData(index++, GetGUID().GetCounter());
7491 stmt->SetData(index++, statusItr->first);
7492 stmt->SetData(index++, uint8(statusItr->second.Status));
7493 stmt->SetData(index++, statusItr->second.Explored);
7494 stmt->SetData(index++, uint32(statusItr->second.Timer / IN_MILLISECONDS + GameTime::GetGameTime().count()));
7495
7496 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
7497 stmt->SetData(index++, statusItr->second.CreatureOrGOCount[i]);
7498
7499 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
7500 stmt->SetData(index++, statusItr->second.ItemCount[i]);
7501
7502 stmt->SetData(index, statusItr->second.PlayerCount);
7503 trans->Append(stmt);
7504 }
7505 }
7506 else
7507 {
7508 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
7509 stmt->SetData(0, GetGUID().GetCounter());
7510 stmt->SetData(1, saveItr->first);
7511 trans->Append(stmt);
7512 }
7513 }
7514
7515 m_QuestStatusSave.clear();
7516
7517 for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr)
7518 {
7519 if (saveItr->second)
7520 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
7521 else // xinef: what the is this? quest can be removed by spelleffect if (!keepAbandoned)
7523
7524 stmt->SetData(0, GetGUID().GetCounter());
7525 stmt->SetData(1, saveItr->first);
7526 trans->Append(stmt);
7527 }
7528
7529 m_RewardedQuestsSave.clear();
7530
7531 if (!isTransaction)
7532 CharacterDatabase.CommitTransaction(trans);
7533}
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST
Definition: CharacterDatabase.h:436
@ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST
Definition: CharacterDatabase.h:434
@ CHAR_REP_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:433
@ CHAR_INS_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:435
@ CLEANING_FLAG_QUESTSTATUS
Definition: CharacterDatabaseCleaner.h:31
QuestStatusSaveMap m_QuestStatusSave
Definition: Player.h:2761
QuestStatusSaveMap m_RewardedQuestsSave
Definition: Player.h:2764

References CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_INS_CHAR_QUESTSTATUS_REWARDED, CHAR_REP_CHAR_QUESTSTATUS, CharacterDatabase, CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS, ObjectGuid::GetCounter(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, m_QuestStatus, m_QuestStatusSave, m_RewardedQuestsSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_NONE, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveSeasonalQuestStatus()

void Player::_SaveSeasonalQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7597{
7599 {
7600 return;
7601 }
7602
7603 // we don't need transactions here.
7605 stmt->SetData(0, GetGUID().GetCounter());
7606 trans->Append(stmt);
7607
7608 m_SeasonalQuestChanged = false;
7609
7610 if (m_seasonalquests.empty())
7611 {
7612 return;
7613 }
7614
7615 for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
7616 {
7617 uint16 eventId = iter->first;
7618
7619 for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
7620 {
7621 uint32 questId = *itr;
7622
7623 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
7624 stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
7625 trans->Append(stmt);
7626 }
7627 }
7628}
@ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS
Definition: CharacterDatabase.h:77
@ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR
Definition: CharacterDatabase.h:62
void SetArguments(Args &&... args)
Definition: PreparedStatement.h:119

References CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_SeasonalQuestChanged, m_seasonalquests, PreparedStatementBase::SetArguments(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSkills()

void Player::_SaveSkills ( CharacterDatabaseTransaction  trans)
7653{
7654 CharacterDatabasePreparedStatement* stmt = nullptr;
7655 // we don't need transactions here.
7656 for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();)
7657 {
7658 if (itr->second.uState == SKILL_UNCHANGED)
7659 {
7660 ++itr;
7661 continue;
7662 }
7663
7664 if (itr->second.uState == SKILL_DELETED)
7665 {
7666 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
7667 stmt->SetData(0, GetGUID().GetCounter());
7668 stmt->SetData(1, itr->first);
7669 trans->Append(stmt);
7670
7671 mSkillStatus.erase(itr++);
7672 continue;
7673 }
7674
7675 uint32 valueData = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos));
7676 uint16 value = SKILL_VALUE(valueData);
7677 uint16 max = SKILL_MAX(valueData);
7678
7679 switch (itr->second.uState)
7680 {
7681 case SKILL_NEW:
7682 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
7683 stmt->SetData(0, GetGUID().GetCounter());
7684 stmt->SetData(1, uint16(itr->first));
7685 stmt->SetData(2, value);
7686 stmt->SetData(3, max);
7687 trans->Append(stmt);
7688
7689 break;
7690 case SKILL_CHANGED:
7691 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
7692 stmt->SetData(0, value);
7693 stmt->SetData(1, max);
7694 stmt->SetData(2, GetGUID().GetCounter());
7695 stmt->SetData(3, uint16(itr->first));
7696 trans->Append(stmt);
7697
7698 break;
7699 default:
7700 break;
7701 }
7702 itr->second.uState = SKILL_UNCHANGED;
7703
7704 ++itr;
7705 }
7706}
#define SKILL_MAX(x)
Definition: Player.h:83
#define SKILL_VALUE(x)
Definition: Player.h:82
@ SKILL_DELETED
Definition: Player.h:642
@ SKILL_CHANGED
Definition: Player.h:640
@ SKILL_NEW
Definition: Player.h:641
@ CHAR_INS_CHAR_SKILLS
Definition: CharacterDatabase.h:441
@ CHAR_UDP_CHAR_SKILLS
Definition: CharacterDatabase.h:442
@ CHAR_DEL_CHAR_SKILL_BY_SKILL
Definition: CharacterDatabase.h:440

References CHAR_DEL_CHAR_SKILL_BY_SKILL, CHAR_INS_CHAR_SKILLS, CHAR_UDP_CHAR_SKILLS, CharacterDatabase, Object::GetGUID(), Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_UNCHANGED, and SKILL_VALUE.

Referenced by SaveToDB().

◆ _SaveSpellCooldowns()

void Player::_SaveSpellCooldowns ( CharacterDatabaseTransaction  trans,
bool  logout 
)
3603{
3605 stmt->SetData(0, GetGUID().GetCounter());
3606 trans->Append(stmt);
3607
3608 time_t curTime = GameTime::GetGameTime().count();
3609 uint32 curMSTime = GameTime::GetGameTimeMS().count();
3610 uint32 infTime = curMSTime + infinityCooldownDelayCheck;
3611
3612 bool first_round = true;
3613 std::ostringstream ss;
3614
3615 // remove outdated and save active
3616 for (SpellCooldowns::iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end();)
3617 {
3618 // Xinef: dummy cooldown for procs
3619 if (itr->first == uint32(-1))
3620 {
3621 ++itr;
3622 continue;
3623 }
3624
3625 if (itr->second.end <= curMSTime + 1000)
3626 m_spellCooldowns.erase(itr++);
3627 else if (itr->second.end <= infTime && (logout || itr->second.end > (curMSTime + 5 * MINUTE * IN_MILLISECONDS))) // not save locked cooldowns, it will be reset or set at reload
3628 {
3629 if (first_round)
3630 {
3631 ss << "INSERT INTO character_spell_cooldown (guid, spell, category, item, time, needSend) VALUES ";
3632 first_round = false;
3633 }
3634 // next new/changed record prefix
3635 else
3636 ss << ',';
3637
3638 uint64 cooldown = uint64(((itr->second.end - curMSTime) / IN_MILLISECONDS) + curTime);
3639 ss << '(' << GetGUID().GetCounter() << ',' << itr->first << ',' << itr->second.category << "," << itr->second.itemid << ',' << cooldown << ',' << (itr->second.needSendToClient ? '1' : '0') << ')';
3640 ++itr;
3641 }
3642 else
3643 ++itr;
3644 }
3645 // if something changed execute
3646 if (!first_round)
3647 trans->Append(ss.str().c_str());
3648}
static constexpr uint32 infinityCooldownDelayCheck
Definition: Unit.h:47
@ CHAR_DEL_CHAR_SPELL_COOLDOWN
Definition: CharacterDatabase.h:401

References CHAR_DEL_CHAR_SPELL_COOLDOWN, CharacterDatabase, ObjectGuid::GetCounter(), GameTime::GetGameTime(), GameTime::GetGameTimeMS(), Object::GetGUID(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSpells()

void Player::_SaveSpells ( CharacterDatabaseTransaction  trans)
protected
7709{
7710 CharacterDatabasePreparedStatement* stmt = nullptr;
7711
7712 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
7713 {
7714 // xinef: skip temporary spells
7715 if (itr->second->State == PLAYERSPELL_TEMPORARY)
7716 {
7717 ++itr;
7718 continue;
7719 }
7720
7721 // xinef: Delete statement for removed / updated spell
7722 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
7723 {
7724 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL);
7725 stmt->SetData(0, GetGUID().GetCounter());
7726 stmt->SetData(1, itr->first);
7727 trans->Append(stmt);
7728 }
7729
7730 // xinef: insert statement for new / updated spell
7731 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
7732 {
7733 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL);
7734 stmt->SetData(0, GetGUID().GetCounter());
7735 stmt->SetData(1, itr->first);
7736 stmt->SetData(2, itr->second->specMask);
7737 trans->Append(stmt);
7738 }
7739
7740 if (itr->second->State == PLAYERSPELL_REMOVED)
7741 {
7742 delete itr->second;
7743 m_spells.erase(itr++);
7744 }
7745 else
7746 {
7747 itr->second->State = PLAYERSPELL_UNCHANGED;
7748 ++itr;
7749 }
7750 }
7751}
@ CHAR_INS_CHAR_SPELL
Definition: CharacterDatabase.h:443
@ CHAR_DEL_CHAR_SPELL_BY_SPELL
Definition: CharacterDatabase.h:394

References CHAR_DEL_CHAR_SPELL_BY_SPELL, CHAR_INS_CHAR_SPELL, CharacterDatabase, Object::GetGUID(), m_spells, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveStats()

void Player::_SaveStats ( CharacterDatabaseTransaction  trans)
protected
7756{
7757 // check if stat saving is enabled and if char level is high enough
7758 if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || GetLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
7759 return;
7760
7761 CharacterDatabasePreparedStatement* stmt = nullptr;
7762
7763 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
7764 stmt->SetData(0, GetGUID().GetCounter());
7765 trans->Append(stmt);
7766
7767 uint8 index = 0;
7768
7769 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
7770 stmt->SetData(index++, GetGUID().GetCounter());
7771 stmt->SetData(index++, GetMaxHealth());
7772
7773 for (uint8 i = 0; i < MAX_POWERS; ++i)
7774 stmt->SetData(index++, GetMaxPower(Powers(i)));
7775
7776 for (uint8 i = 0; i < MAX_STATS; ++i)
7777 stmt->SetData(index++, GetStat(Stats(i)));
7778
7779 for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
7780 stmt->SetData(index++, GetResistance(SpellSchools(i)));
7781
7790 stmt->SetData(index++, GetBaseSpellPowerBonus());
7792
7793 trans->Append(stmt);
7794}
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ PLAYER_FIELD_COMBAT_RATING_1
Definition: UpdateFields.h:380
@ PLAYER_PARRY_PERCENTAGE
Definition: UpdateFields.h:348
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ PLAYER_DODGE_PERCENTAGE
Definition: UpdateFields.h:347
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ CONFIG_MIN_LEVEL_STAT_SAVE
Definition: IWorld.h:352
@ CHAR_DEL_CHAR_STATS
Definition: CharacterDatabase.h:444
@ CHAR_INS_CHAR_STATS
Definition: CharacterDatabase.h:445
#define MAX_STATS
Definition: SharedDefines.h:265
SpellSchools
Definition: SharedDefines.h:282
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
Stats
Definition: SharedDefines.h:257
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1947
uint32 GetResistance(SpellSchools school) const
Definition: Unit.h:777
uint32 GetMaxHealth() const
Definition: Unit.h:783
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:805
float GetStat(Stats stat) const
Definition: Unit.h:772

References CHAR_DEL_CHAR_STATS, CHAR_INS_CHAR_STATS, CharacterDatabase, CONFIG_MIN_LEVEL_STAT_SAVE, CR_CRIT_TAKEN_SPELL, GetBaseSpellPowerBonus(), Object::GetFloatValue(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), Object::GetUInt32Value(), MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, PreparedStatementBase::SetData(), sWorld, UNIT_FIELD_ATTACK_POWER, and UNIT_FIELD_RANGED_ATTACK_POWER.

Referenced by SaveToDB().

◆ _SaveTalents()

void Player::_SaveTalents ( CharacterDatabaseTransaction  trans)
protected
14975{
14976 CharacterDatabasePreparedStatement* stmt = nullptr;
14977
14978 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end();)
14979 {
14980 // xinef: skip temporary spells
14981 if (itr->second->State == PLAYERSPELL_TEMPORARY)
14982 {
14983 ++itr;
14984 continue;
14985 }
14986
14987 // xinef: delete statement for removed / updated talent
14988 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
14989 {
14990 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
14991 stmt->SetData(0, GetGUID().GetCounter());
14992 stmt->SetData(1, itr->first);
14993 trans->Append(stmt);
14994 }
14995
14996 // xinef: insert statement for new / updated spell
14997 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
14998 {
14999 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
15000 stmt->SetData(0, GetGUID().GetCounter());
15001 stmt->SetData(1, itr->first);
15002 stmt->SetData(2, itr->second->specMask);
15003 trans->Append(stmt);
15004 }
15005
15006 if (itr->second->State == PLAYERSPELL_REMOVED)
15007 {
15008 delete itr->second;
15009 m_talents.erase(itr++);
15010 }
15011 else
15012 {
15013 itr->second->State = PLAYERSPELL_UNCHANGED;
15014 ++itr;
15015 }
15016 }
15017}
@ CHAR_INS_CHAR_TALENT
Definition: CharacterDatabase.h:453
@ CHAR_DEL_CHAR_TALENT_BY_SPELL
Definition: CharacterDatabase.h:452

References CHAR_DEL_CHAR_TALENT_BY_SPELL, CHAR_INS_CHAR_TALENT, CharacterDatabase, Object::GetGUID(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveWeeklyQuestStatus()

void Player::_SaveWeeklyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7574{
7575 if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
7576 return;
7577
7578 // we don't need transactions here.
7580 stmt->SetData(0, GetGUID().GetCounter());
7581 trans->Append(stmt);
7582
7583 for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
7584 {
7585 uint32 quest_id = *iter;
7586
7587 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
7588 stmt->SetData(0, GetGUID().GetCounter());
7589 stmt->SetData(1, quest_id);
7590 trans->Append(stmt);
7591 }
7592
7593 m_WeeklyQuestChanged = false;
7594}
@ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR
Definition: CharacterDatabase.h:60
@ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS
Definition: CharacterDatabase.h:75

References CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_WeeklyQuestChanged, m_weeklyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _StoreItem()

Item * Player::_StoreItem ( uint16  pos,
Item pItem,
uint32  count,
bool  clone,
bool  update 
)
private
2625{
2626 if (!pItem)
2627 return nullptr;
2628
2629 uint8 bag = pos >> 8;
2630 uint8 slot = pos & 255;
2631
2632 LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = {}, slot = {}, item = {}, count = {}, {}", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().ToString());
2633
2634 Item* pItem2 = GetItemByPos(bag, slot);
2635
2636 if (!pItem2)
2637 {
2638 if (clone)
2639 pItem = pItem->CloneItem(count, this);
2640 else
2641 pItem->SetCount(count);
2642
2643 if (!pItem)
2644 return nullptr;
2645
2646 if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2647 pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2648 (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2649 pItem->SetBinding(true);
2650
2651 Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag);
2652 if (!pBag)
2653 {
2654 m_items[slot] = pItem;
2655 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2658
2659 pItem->SetSlot(slot);
2660 pItem->SetContainer(nullptr);
2661
2662 // need update known currency
2664 AddKnownCurrency(pItem->GetEntry());
2665 }
2666 else
2667 pBag->StoreItem(slot, pItem, update);
2668
2669 if (IsInWorld() && update)
2670 {
2671 pItem->AddToWorld();
2672 pItem->SendUpdateToPlayer(this);
2673 }
2674
2675 pItem->SetState(ITEM_CHANGED, this);
2676 if (pBag)
2677 pBag->SetState(ITEM_CHANGED, this);
2678
2680 AddItemDurations(pItem);
2681
2682 return pItem;
2683 }
2684 else
2685 {
2686 if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2687 pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2688 (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2689 pItem2->SetBinding(true);
2690
2691 pItem2->SetCount(pItem2->GetCount() + count);
2692 if (IsInWorld() && update)
2693 pItem2->SendUpdateToPlayer(this);
2694
2695 if (!clone)
2696 {
2697 // delete item (it not in any slot currently)
2698 if (IsInWorld() && update)
2699 {
2700 pItem->RemoveFromWorld();
2701 pItem->DestroyForPlayer(this);
2702 }
2703
2705 RemoveItemDurations(pItem);
2706
2707 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2708 pItem->SetNotRefundable(this);
2709 pItem->ClearSoulboundTradeable(this);
2710 RemoveTradeableItem(pItem);
2711 pItem->SetState(ITEM_REMOVED, this);
2712 }
2713
2715
2716 pItem2->SetState(ITEM_CHANGED, this);
2717
2718 return pItem2;
2719 }
2720}
@ PLAYER_FIELD_INV_SLOT_HEAD
Definition: UpdateFields.h:327
@ ITEM_FIELD_OWNER
Definition: UpdateFields.h:35
@ ITEM_FIELD_CONTAINED
Definition: UpdateFields.h:36
@ BIND_WHEN_EQUIPPED
Definition: ItemTemplate.h:97
@ BIND_QUEST_ITEM
Definition: ItemTemplate.h:99
@ BIND_WHEN_PICKED_UP
Definition: ItemTemplate.h:96
@ CURRENCYTOKEN_SLOT_END
Definition: Player.h:737
@ CURRENCYTOKEN_SLOT_START
Definition: Player.h:736
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition: Bag.cpp:154
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition: Item.cpp:715
void SetBinding(bool val)
Definition: Item.h:235
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition: Item.cpp:1119
void SetCount(uint32 value)
Definition: Item.h:273
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr)
Definition: Item.cpp:1201
void SetSlot(uint8 slot)
Definition: Item.h:284
uint32 GetCount() const
Definition: Item.h:272
void SetOwnerGUID(ObjectGuid guid)
Definition: Item.h:232
void SetContainer(Bag *container)
Definition: Item.h:286
uint32 Bonding
Definition: ItemTemplate.h:663
virtual void DestroyForPlayer(Player *target, bool onDeath=false) const
Definition: Object.cpp:274
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
virtual void AddToWorld()
Definition: Object.cpp:152
virtual void RemoveFromWorld()
Definition: Object.cpp:166
void SendUpdateToPlayer(Player *player)
Definition: Object.cpp:246
Bag * GetBagByPos(uint8 slot) const
Definition: PlayerStorage.cpp:480
void AddEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4201
void RemoveEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4214
void AddItemDurations(Item *item)
Definition: Player.cpp:12406
void AddKnownCurrency(uint32 itemId)
Definition: Player.cpp:14159

References AddEnchantmentDurations(), AddItemDurations(), AddKnownCurrency(), Object::AddToWorld(), BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, Item::ClearSoulboundTradeable(), Item::CloneItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, Object::DestroyForPlayer(), GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, IsBagPos(), Object::IsInWorld(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, ITEM_REMOVED, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Item::SetBinding(), Item::SetContainer(), Item::SetCount(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetSlot(), Item::SetState(), Bag::StoreItem(), and ObjectGuid::ToString().

Referenced by StoreItem().

◆ _StoreOrEquipNewItem()

bool Player::_StoreOrEquipNewItem ( uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot,
int32  price,
ItemTemplate const *  pProto,
Creature pVendor,
VendorItem const *  crItem,
bool  bStore 
)
inline
10599{
10600 ItemPosCountVec vDest;
10601 uint16 uiDest = 0;
10602 InventoryResult msg = bStore ?
10603 CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) :
10604 CanEquipNewItem(slot, uiDest, item, false);
10605 if (msg != EQUIP_ERR_OK)
10606 {
10607 SendEquipError(msg, nullptr, nullptr, item);
10608 return false;
10609 }
10610
10611 ModifyMoney(-price);
10612
10613 if (crItem->ExtendedCost) // case for new honor system
10614 {
10615 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10616 if (iece->reqhonorpoints)
10617 ModifyHonorPoints(- int32(iece->reqhonorpoints * count));
10618
10619 if (iece->reqarenapoints)
10620 ModifyArenaPoints(- int32(iece->reqarenapoints * count));
10621
10622 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10623 {
10624 if (iece->reqitem[i])
10625 DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
10626 }
10627 }
10628
10629 sScriptMgr->OnBeforeStoreOrEquipNewItem(this, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore);
10630
10631 Item* it = bStore ? StoreNewItem(vDest, item, true) : EquipNewItem(uiDest, item, true);
10632 if (it)
10633 {
10634 uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count);
10635
10636 WorldPacket data(SMSG_BUY_ITEM, (8 + 4 + 4 + 4));
10637 data << pVendor->GetGUID();
10638 data << uint32(vendorslot + 1); // numbered from 1 at client
10639 data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
10640 data << uint32(count);
10641 GetSession()->SendPacket(&data);
10642 SendNewItem(it, pProto->BuyCount * count, true, false, false);
10643
10644 if (!bStore)
10646
10647 if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1)
10648 {
10650 it->SetRefundRecipient(GetGUID().GetCounter());
10651 it->SetPaidMoney(price);
10652 it->SetPaidExtendedCost(crItem->ExtendedCost);
10653 it->SaveRefundDataToDB();
10655 }
10656 }
10657
10658 sScriptMgr->OnAfterStoreOrEquipNewItem(this, vendorslot, it, count, bag, slot, pProto, pVendor, crItem, bStore);
10659
10660 return true;
10661}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
InventoryResult
Definition: Item.h:46
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
Definition: ItemTemplate.h:159
#define MAX_ITEM_EXTENDED_COST_REQUIREMENTS
Definition: DBCStructure.h:1182
@ SMSG_BUY_ITEM
Definition: Opcodes.h:450
uint32 UpdateVendorItemCurrentCount(VendorItem const *vItem, uint32 used_count)
Definition: Creature.cpp:3081
void SaveRefundDataToDB()
Definition: Item.cpp:1173
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
InventoryResult CanEquipNewItem(uint8 slot, uint16 &dest, uint32 item, bool swap) const
Definition: PlayerStorage.cpp:1814
bool ModifyMoney(int32 amount, bool sendError=true)
Definition: Player.cpp:11467
Item * EquipNewItem(uint16 pos, uint32 item, bool update)
Definition: PlayerStorage.cpp:2722
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition: PlayerStorage.cpp:4765
void AutoUnequipOffhandIfNeed(bool force=false)
Definition: Player.cpp:12415
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition: PlayerStorage.cpp:3136
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition: Player.cpp:6227
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition: Player.cpp:6243
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition: PlayerStorage.cpp:2539
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition: PlayerStorage.cpp:4036
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition: Player.h:1271
Definition: WorldPacket.h:27
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:214
Definition: DBCStructure.h:1185
uint32 reqarenapoints
Definition: DBCStructure.h:1188
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1191
uint32 reqitem[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1190
uint32 reqhonorpoints
Definition: DBCStructure.h:1187

References AddRefundReference(), AutoUnequipOffhandIfNeed(), ItemTemplate::BuyCount, CanEquipNewItem(), CanStoreNewItem(), DestroyItemCount(), EQUIP_ERR_OK, EquipNewItem(), VendorItem::ExtendedCost, Object::GetGUID(), ItemTemplate::GetMaxStackSize(), GetSession(), ItemTemplate::HasFlag(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_ITEM_PURCHASE_RECORD, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, VendorItem::maxcount, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, Item::SaveRefundDataToDB(), SendEquipError(), SendNewItem(), WorldSession::SendPacket(), Object::SetFlag(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), sItemExtendedCostStore, SMSG_BUY_ITEM, sScriptMgr, StoreNewItem(), and Creature::UpdateVendorItemCurrentCount().

Referenced by BuyItemFromVendorSlot().

◆ AbandonQuest()

void Player::AbandonQuest ( uint32  quest_id)
925{
926 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
927 {
928 // It will Destroy quest items on quests abandons.
929 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
930 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
931 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
932 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
933
934 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
935 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
936 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
937 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
938 }
939}
#define QUEST_SOURCE_ITEM_IDS_COUNT
Definition: QuestDef.h:37

References BIND_QUEST_ITEM, DestroyItemCount(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, and sObjectMgr.

Referenced by WorldSession::HandleQuestLogRemoveQuest().

◆ ActivateSpec()

void Player::ActivateSpec ( uint8  spec)
15020{
15021 // xinef: some basic checks
15022 if (GetActiveSpec() == spec)
15023 return;
15024
15025 if (spec > GetSpecsCount())
15026 return;
15027
15028 // xinef: interrupt currently casted spell just in case
15029 if (IsNonMeleeSpellCast(false))
15031
15032 // xinef: save current actions order
15033 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15034 _SaveActions(trans);
15035 CharacterDatabase.CommitTransaction(trans);
15036
15037 // xinef: remove pet, it will be resummoned later
15038 if (Pet* pet = GetPet())
15040
15041 // xinef: remove other summoned units and clear reactives
15045
15046 // xinef: let client clear his current Actions
15048 uint8 oldSpec = GetActiveSpec();
15049
15050 std::unordered_set<uint32> removedSpecAuras;
15051
15052 // xinef: reset talent auras
15053 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15054 {
15055 if (itr->second->State == PLAYERSPELL_REMOVED)
15056 continue;
15057
15058 // xinef: remove all active talent auras
15059 if (!(itr->second->specMask & GetActiveSpecMask()))
15060 continue;
15061
15062 _removeTalentAurasAndSpells(itr->first);
15063
15064 // pussywizard: was => isn't
15065 if (!itr->second->IsInSpec(spec) && !itr->second->inSpellBook)
15066 SendLearnPacket(itr->first, false);
15067
15068 removedSpecAuras.insert(itr->first);
15069 }
15070
15071 // xinef: remove glyph auras
15072 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15073 if (uint32 glyphId = m_Glyphs[GetActiveSpec()][slot])
15074 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15075 {
15076 RemoveAurasDueToSpell(glyphEntry->SpellId);
15077 removedSpecAuras.insert(glyphEntry->SpellId);
15078 }
15079
15080 // xinef: set active spec as new one
15081 SetActiveSpec(spec);
15082 uint32 spentTalents = 0;
15083
15084 // xinef: add talent auras
15085 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15086 {
15087 if (itr->second->State == PLAYERSPELL_REMOVED)
15088 continue;
15089
15090 // xinef: talent not in new spec
15091 if (!(itr->second->specMask & GetActiveSpecMask()))
15092 continue;
15093
15094 // pussywizard: wasn't => is
15095 if (!itr->second->IsInSpec(oldSpec) && !itr->second->inSpellBook)
15096 SendLearnPacket(itr->first, true);
15097
15098 _addTalentAurasAndSpells(itr->first);
15099 TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first);
15100 spentTalents += talentPos->rank + 1;
15101
15102 removedSpecAuras.erase(itr->first);
15103 }
15104
15105 // pussywizard: remove spells that are in previous spec, but are not present in new one (or are in new spec, but not in the old one)
15106 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15107 {
15108 if (!itr->second->Active || itr->second->State == PLAYERSPELL_REMOVED)
15109 continue;
15110
15111 // pussywizard: was => isn't
15112 if (itr->second->IsInSpec(oldSpec) && !itr->second->IsInSpec(spec))
15113 {
15114 SendLearnPacket(itr->first, false);
15115 // We want to remove all auras of the unlearned spell
15116 _removeTalentAurasAndSpells(itr->first);
15117
15118 removedSpecAuras.insert(itr->first);
15119 }
15120 // pussywizard: wasn't => is
15121 else if (!itr->second->IsInSpec(oldSpec) && itr->second->IsInSpec(spec))
15122 {
15123 SendLearnPacket(itr->first, true);
15124
15125 removedSpecAuras.erase(itr->first);
15126 }
15127 }
15128
15129 // xinef: apply glyphs from second spec
15130 if (GetActiveSpec() != oldSpec)
15131 {
15132 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15133 {
15134 uint32 glyphId = m_Glyphs[GetActiveSpec()][slot];
15135 if (glyphId)
15136 {
15137 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15138 {
15140 removedSpecAuras.erase(glyphEntry->SpellId);
15141 }
15142 }
15143
15144 SetGlyph(slot, glyphId, true);
15145 }
15146 }
15147
15148 // Remove auras triggered/activated by talents/glyphs
15149 // Mostly explicit casts in dummy aura scripts
15150 if (!removedSpecAuras.empty())
15151 {
15152 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
15153 {
15154 Aura* aura = iter->second;
15155 if (SpellInfo const* triggeredByAuraSpellInfo = aura->GetTriggeredByAuraSpellInfo())
15156 {
15157 if (removedSpecAuras.find(triggeredByAuraSpellInfo->Id) != removedSpecAuras.end())
15158 {
15159 RemoveOwnedAura(iter);
15160 continue;
15161 }
15162 }
15163 ++iter;
15164 }
15165 }
15166
15167 m_usedTalentCount = spentTalents;
15169
15170 // load them asynchronously
15171 {
15173 stmt->SetData(0, GetGUID().GetCounter());
15174 stmt->SetData(1, m_activeSpec);
15175
15176 WorldSession* mySess = GetSession();
15177 mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
15178 .WithPreparedCallback([mySess](PreparedQueryResult result)
15179 {
15180 // safe callback, we can't pass this pointer directly
15181 // in case player logs out before db response (player would be deleted in that case)
15182 if (Player* thisPlayer = mySess->GetPlayer())
15183 thisPlayer->LoadActions(result);
15184 }));
15185 }
15186
15187 // xinef: reset power
15188 Powers pw = getPowerType();
15189 if (pw != POWER_MANA)
15190 SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
15191 SetPower(pw, 0);
15192
15193 // xinef: remove titan grip if player had it set and does not have appropriate talent
15194 if (!HasTalent(46917, GetActiveSpec()) && m_canTitanGrip)
15195 SetCanTitanGrip(false);
15196 // xinef: remove dual wield if player does not have dual wield spell (shamans)
15197 if (!HasSpell(674) && m_canDualWield)
15198 SetCanDualWield(false);
15199
15201
15202 // Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
15204 RemoveAurasDueToSpell(25780);
15205
15206 // Xinef: Remove talented single target auras at other targets
15207 AuraList& scAuras = GetSingleCastAuras();
15208 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
15209 {
15210 Aura* aura = *iter;
15211 if (!HasActiveSpell(aura->GetId()) && !HasTalent(aura->GetId(), GetActiveSpec()) && !aura->GetCastItemGUID())
15212 {
15213 aura->Remove();
15214 iter = scAuras.begin();
15215 }
15216 else
15217 ++iter;
15218 }
15219
15220 sScriptMgr->OnAfterSpecSlotChanged(this, GetActiveSpec());
15221}
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:213
@ CHAR_SEL_CHARACTER_ACTIONS_SPEC
Definition: CharacterDatabase.h:81
@ POWER_MANA
Definition: SharedDefines.h:269
@ CLASS_PALADIN
Definition: SharedDefines.h:142
T & AddCallback(T &&query)
Definition: AsyncCallbackProcessor.h:34
Definition: Pet.h:41
void InitTalentForLevel()
Definition: Player.cpp:2552
void SetCanTitanGrip(bool value)
Definition: Player.cpp:13090
void SetActiveSpec(uint8 spec)
Definition: Player.h:1722
Pet * GetPet() const
Definition: Player.cpp:8862
bool HasTalent(uint32 spell_id, uint8 spec) const
Definition: Player.cpp:3864
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Definition: Player.cpp:9013
void _SaveActions(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7149
uint8 GetSpecsCount() const
Definition: Player.h:1723
bool HasSpell(uint32 spell) const override
Definition: Player.cpp:3858
void SendActionButtons(uint32 state) const
Definition: Player.cpp:5494
void _addTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:3001
virtual void SetCanDualWield(bool value)
Definition: Unit.h:686
std::list< Aura * > AuraList
Definition: Unit.h:647
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4094
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15493
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4064
void ClearAllReactives()
Definition: Unit.cpp:16855
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11140
bool m_canDualWield
Definition: Unit.h:696
Powers getPowerType() const
Definition: Unit.h:801
AuraList & GetSingleCastAuras()
Definition: Unit.h:1311
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11021
Player session in the World.
Definition: WorldSession.h:330
QueryCallbackProcessor & GetQueryProcessor()
Definition: WorldSession.h:1077
uint32 GetId() const
Definition: SpellAuras.cpp:466
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103
SpellInfo const * GetTriggeredByAuraSpellInfo() const
Definition: SpellAuras.cpp:2761
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0

References _addTalentAurasAndSpells(), _removeTalentAurasAndSpells(), _SaveActions(), AsyncCallbackProcessor< T >::AddCallback(), AutoUnequipOffhandIfNeed(), Unit::CastSpell(), CHAR_SEL_CHARACTER_ACTIONS_SPEC, CharacterDatabase, CLASS_CONTEXT_ABILITY, CLASS_PALADIN, Unit::ClearAllReactives(), GetActiveSpec(), GetActiveSpecMask(), Aura::GetCastItemGUID(), Object::GetGUID(), Aura::GetId(), GetPet(), Unit::getPowerType(), WorldSession::GetQueryProcessor(), GetSession(), Unit::GetSingleCastAuras(), GetSpecsCount(), GetTalentSpellPos(), Aura::GetTriggeredByAuraSpellInfo(), HasActiveSpell(), HasSpell(), HasTalent(), InitTalentForLevel(), Unit::InterruptNonMeleeSpells(), IsClass(), Unit::IsNonMeleeSpellCast(), m_activeSpec, Unit::m_canDualWield, m_canTitanGrip, m_Glyphs, Unit::m_ownedAuras, m_spells, m_talents, m_usedTalentCount, MAX_GLYPH_SLOT_INDEX, PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, POWER_MANA, TalentSpellPos::rank, Aura::Remove(), Unit::RemoveAllControlled(), Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), RemovePet(), SendActionButtons(), SendLearnPacket(), SetActiveSpec(), Unit::SetCanDualWield(), SetCanTitanGrip(), PreparedStatementBase::SetData(), SetGlyph(), Unit::SetPower(), sGlyphPropertiesStore, sScriptMgr, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, TRIGGERED_IGNORE_SHAPESHIFT, and Unit::UnsummonAllTotems().

Referenced by UpdateSpecCount().

◆ ActivateTaxiPathTo() [1/2]

bool Player::ActivateTaxiPathTo ( std::vector< uint32 > const &  nodes,
Creature npc = nullptr,
uint32  spellid = 1 
)
10187{
10188 if (nodes.size() < 2)
10189 return false;
10190
10191 // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root
10193 {
10195 return false;
10196 }
10197
10199 return false;
10200
10201 // taximaster case
10202 if (npc)
10203 {
10204 // not let cheating with start flight mounted
10205 if (IsMounted())
10206 {
10208 return false;
10209 }
10210
10212 {
10214 return false;
10215 }
10216
10217 // not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
10218 if (IsNonMeleeSpellCast(false))
10219 {
10221 return false;
10222 }
10223 }
10224 // cast case or scripted call case
10225 else
10226 {
10228
10231
10233 if (spell->m_spellInfo->Id != spellid)
10235
10237
10239 if (spell->m_spellInfo->Id != spellid)
10241 }
10242
10243 uint32 sourcenode = nodes[0];
10244
10245 // starting node too far away (cheat?)
10246 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(sourcenode);
10247 if (!node)
10248 {
10250 return false;
10251 }
10252
10253 // Prepare to flight start now
10254
10255 // stop combat at start taxi flight if any
10256 CombatStop();
10257
10260 ExitVehicle();
10261
10262 // stop trade (client cancel trade at taxi map open but cheating tools can be used for reopen it)
10263 TradeCancel(true);
10264
10265 // clean not finished taxi path if any
10267
10268 // 0 element current node
10269 m_taxi.AddTaxiDestination(sourcenode);
10270
10271 // fill destinations path tail
10272 uint32 sourcepath = 0;
10273 uint32 totalcost = 0;
10274 uint32 firstcost = 0;
10275
10276 uint32 prevnode = sourcenode;
10277 uint32 lastnode = 0;
10278
10279 for (uint32 i = 1; i < nodes.size(); ++i)
10280 {
10281 uint32 path, cost;
10282
10283 lastnode = nodes[i];
10284 sObjectMgr->GetTaxiPath(prevnode, lastnode, path, cost);
10285
10286 if (!path)
10287 {
10289 return false;
10290 }
10291
10292 totalcost += cost;
10293 if (i == 1)
10294 firstcost = cost;
10295
10296 if (prevnode == sourcenode)
10297 sourcepath = path;
10298
10299 m_taxi.AddTaxiDestination(lastnode);
10300
10301 prevnode = lastnode;
10302 }
10303
10304 // get mount model (in case non taximaster (npc == nullptr) allow more wide lookup)
10305 //
10306 // Hack-Fix for Alliance not being able to use Acherus taxi. There is
10307 // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
10308 // change but I couldn't find a suitable alternative. OK to use class because only DK
10309 // can use this taxi.
10310 uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TAXI)));
10311
10312 // in spell case allow 0 model
10313 if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
10314 {
10317 return false;
10318 }
10319
10320 uint32 money = GetMoney();
10321
10322 if (npc)
10323 {
10324 float discount = GetReputationPriceDiscount(npc);
10325 totalcost = uint32(ceil(totalcost * discount));
10326 firstcost = uint32(ceil(firstcost * discount));
10328 }
10329 else
10330 {
10332 }
10333
10334 if (money < totalcost)
10335 {
10338 return false;
10339 }
10340
10341 //Checks and preparations done, DO FLIGHT
10343
10344 // prevent stealth flight
10345 //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
10346
10347 // Xinef: dont use instant flight paths if spellid is present (custom calls use spellid = 1)
10348 if ((sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 1 || (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && m_isInstantFlightOn)) && !spellid)
10349 {
10350 TaxiNodesEntry const* lastPathNode = sTaxiNodesStore.LookupEntry(nodes[nodes.size() - 1]);
10352 ModifyMoney(-(int32)totalcost);
10354 TeleportTo(lastPathNode->map_id, lastPathNode->x, lastPathNode->y, lastPathNode->z, GetOrientation());
10355 return false;
10356 }
10357 else
10358 {
10359 m_flightSpellActivated = spellid;
10360 ModifyMoney(-(int32)firstcost);
10363 GetSession()->SendDoFlight(mount_display_id, sourcepath);
10364 }
10365 return true;
10366}
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
npc
Definition: BattlegroundSA.h:75
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:539
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:538
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:540
@ CLASS_CONTEXT_TAXI
Definition: UnitDefines.h:210
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:159
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:152
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:231
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:386
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition: DBCEnums.h:215
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition: DBCEnums.h:176
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
@ ERR_TAXIPLAYERBUSY
Definition: SharedDefines.h:3602
@ ERR_TAXIOK
Definition: SharedDefines.h:3595
@ ERR_TAXINOSUCHPATH
Definition: SharedDefines.h:3597
@ ERR_TAXIUNSPECIFIEDSERVERERROR
Definition: SharedDefines.h:3596
@ ERR_TAXIPLAYERSHAPESHIFTED
Definition: SharedDefines.h:3604
@ ERR_TAXIPLAYERALREADYMOUNTED
Definition: SharedDefines.h:3603
@ ERR_TAXINOTENOUGHMONEY
Definition: SharedDefines.h:3598
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2084
float GetReputationPriceDiscount(Creature const *creature) const
Definition: Player.cpp:12288
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1329
void TradeCancel(bool sendback)
Definition: PlayerStorage.cpp:4103
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9250
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13103
void AddTaxiDestination(uint32 dest)
Definition: PlayerTaxi.h:62
void SetFlightMasterFactionTemplateId(uint32 factionTemplateId)
Definition: PlayerTaxi.h:75
void ClearTaxiDestinations()
Definition: PlayerTaxi.h:61
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4027
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10378
bool IsInDisallowedMountForm() const
Definition: Unit.cpp:21148
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:825
bool IsMounted() const
Definition: Unit.h:887
bool HasUnitState(const uint32 f) const
Definition: Unit.h:739
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5061
bool IsInCombat() const
Definition: Unit.h:1032
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19642
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1404
void SendActivateTaxiReply(ActivateTaxiReply reply)
Definition: TaxiHandler.cpp:280
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode=0)
Definition: TaxiHandler.cpp:110
Definition: Spell.h:284
Definition: DBCStructure.h:1953
float z
Definition: DBCStructure.h:1958
uint32 map_id
Definition: DBCStructure.h:1955
float x
Definition: DBCStructure.h:1956
float y
Definition: DBCStructure.h:1957

References ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, PlayerTaxi::AddTaxiDestination(), CLASS_CONTEXT_TAXI, CLASS_DEATH_KNIGHT, PlayerTaxi::ClearTaxiDestinations(), Unit::CombatStop(), CONFIG_INSTANT_TAXI, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, ERR_TAXINOSUCHPATH, ERR_TAXINOTENOUGHMONEY, ERR_TAXIOK, ERR_TAXIPLAYERALREADYMOUNTED, ERR_TAXIPLAYERBUSY, ERR_TAXIPLAYERSHAPESHIFTED, ERR_TAXIUNSPECIFIEDSERVERERROR, Unit::ExitVehicle(), Unit::GetCurrentSpell(), GetMoney(), Position::GetOrientation(), GetReputationPriceDiscount(), GetSession(), GetTeamId(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::InterruptSpell(), IsClass(), Unit::IsInCombat(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), m_flightSpellActivated, m_isInstantFlightOn, m_taxi, TaxiNodesEntry::map_id, ModifyMoney(), Unit::RemoveAurasByType(), WorldSession::SendActivateTaxiReply(), WorldSession::SendDoFlight(), PlayerTaxi::SetFlightMasterFactionTemplateId(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiNodesStore, StopCastingBindSight(), StopCastingCharm(), sWorld, TeleportTo(), TradeCancel(), UNIT_FLAG_DISABLE_MOVE, UNIT_STATE_ROOT, UNIT_STATE_STUNNED, UpdateAchievementCriteria(), TaxiNodesEntry::x, TaxiNodesEntry::y, and TaxiNodesEntry::z.

Referenced by ActivateTaxiPathTo(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), Aura::HandleAuraSpecificMods(), OPvPCapturePointNA::HandleCustomSpell(), npc_taxi::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), and npc_karynaku::OnQuestAccept().

◆ ActivateTaxiPathTo() [2/2]

bool Player::ActivateTaxiPathTo ( uint32  taxi_path_id,
uint32  spellid = 1 
)
10369{
10370 TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
10371 if (!entry)
10372 return false;
10373
10374 std::vector<uint32> nodes;
10375
10376 nodes.resize(2);
10377 nodes[0] = entry->from;
10378 nodes[1] = entry->to;
10379
10380 return ActivateTaxiPathTo(nodes, nullptr, spellid);
10381}
DBCStorage< TaxiPathEntry > sTaxiPathStore(TaxiPathEntryfmt)
bool ActivateTaxiPathTo(std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
Definition: Player.cpp:10186
Definition: DBCStructure.h:1965
uint32 to
Definition: DBCStructure.h:1968
uint32 from
Definition: DBCStructure.h:1967

References ActivateTaxiPathTo(), TaxiPathEntry::from, sTaxiPathStore, and TaxiPathEntry::to.

◆ addActionButton()

ActionButton * Player::addActionButton ( uint8  button,
uint32  action,
uint8  type 
)
5566{
5567 if (!IsActionButtonDataValid(button, action, type))
5568 return nullptr;
5569
5570 // it create new button (NEW state) if need or return existed
5571 ActionButton& ab = m_actionButtons[button];
5572
5573 // set data and update to CHANGED if not NEW
5574 ab.SetActionAndType(action, ActionButtonType(type));
5575
5576 LOG_DEBUG("entities.player", "Player {} Added Action {} (type {}) to Button {}", GetGUID().ToString(), action, type, button);
5577 return &ab;
5578}
ActionButtonType
Definition: Player.h:228
void SetActionAndType(uint32 action, ActionButtonType type)
Definition: Player.h:262
bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5522

References Object::GetGUID(), IsActionButtonDataValid(), LOG_DEBUG, m_actionButtons, ActionButton::SetActionAndType(), and Position::ToString().

Referenced by _LoadActions(), Create(), and WorldSession::HandleSetActionButtonOpcode().

◆ AddArmorProficiency()

void Player::AddArmorProficiency ( uint32  newflag)
inline
1350{ m_ArmorProficiency |= newflag; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ AddBattlegroundQueueId()

uint32 Player::AddBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12197{
12198 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12199 {
12200 if (_BgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || _BgBattlegroundQueueID[i].bgQueueTypeId == val)
12201 {
12202 _BgBattlegroundQueueID[i].bgQueueTypeId = val;
12203 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12204 return i;
12205 }
12206 }
12207
12209}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ AddEnchantmentDuration()

void Player::AddEnchantmentDuration ( Item item,
EnchantmentSlot  slot,
uint32  duration 
)
4290{
4291 if (!item)
4292 return;
4293
4294 if (slot >= MAX_ENCHANTMENT_SLOT)
4295 return;
4296
4297 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4298 {
4299 if (itr->item == item && itr->slot == slot)
4300 {
4301 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4302 m_enchantDuration.erase(itr);
4303 break;
4304 }
4305 }
4306 if (item && duration > 0)
4307 {
4308 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration / 1000));
4309 m_enchantDuration.push_back(EnchantDuration(item, slot, duration));
4310 }
4311}
@ MAX_ENCHANTMENT_SLOT
Definition: Item.h:183
Definition: Player.h:441
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
Definition: ItemHandler.cpp:1232

References Object::GetGUID(), GetSession(), m_enchantDuration, MAX_ENCHANTMENT_SLOT, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by AddEnchantmentDurations(), and ApplyEnchantment().

◆ AddEnchantmentDurations()

void Player::AddEnchantmentDurations ( Item item)
4202{
4203 for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x)
4204 {
4205 if (!item->GetEnchantmentId(EnchantmentSlot(x)))
4206 continue;
4207
4208 uint32 duration = item->GetEnchantmentDuration(EnchantmentSlot(x));
4209 if (duration > 0)
4210 AddEnchantmentDuration(item, EnchantmentSlot(x), duration);
4211 }
4212}
EnchantmentSlot
Definition: Item.h:168
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:304
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition: Item.h:305
void AddEnchantmentDuration(Item *item, EnchantmentSlot slot, uint32 duration)
Definition: PlayerStorage.cpp:4289

References AddEnchantmentDuration(), Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), and MAX_ENCHANTMENT_SLOT.

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddInstanceEnterTime()

void Player::AddInstanceEnterTime ( uint32  instanceId,
time_t  enterTime 
)
inline
2427 {
2428 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
2429 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
2430 }

References _instanceResetTimes, and HOUR.

Referenced by InstanceMap::AddPlayerToMap().

◆ AddItem()

bool Player::AddItem ( uint32  itemId,
uint32  count 
)
15510{
15511 uint32 noSpaceForCount = 0;
15512 ItemPosCountVec dest;
15513 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
15514 if (msg != EQUIP_ERR_OK)
15515 count -= noSpaceForCount;
15516
15517 if (count == 0 || dest.empty())
15518 {
15519 // -- TODO: Send to mailbox if no space
15520 ChatHandler(GetSession()).PSendSysMessage("You don't have any space in your bags.");
15521 return false;
15522 }
15523
15524 Item* item = StoreNewItem(dest, itemId, true);
15525 if (item)
15526 SendNewItem(item, count, true, false);
15527 else
15528 return false;
15529 return true;
15530}
@ NULL_BAG
Definition: Item.h:40
Definition: Chat.h:39
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:213

References CanStoreNewItem(), EQUIP_ERR_OK, GetSession(), NULL_BAG, NULL_SLOT, ChatHandler::PSendSysMessage(), SendNewItem(), and StoreNewItem().

Referenced by spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), spell_q9452_cast_net::HandleDummy(), spell_catch_the_wild_wolpertinger::HandleEffectApply(), RewardHonor(), and npc_tharnarian::npc_tharnarianAI::sGossipSelect().

◆ AddItemDurations()

void Player::AddItemDurations ( Item item)
12407{
12409 {
12410 m_itemDuration.push_back(item);
12411 item->SendTimeUpdate(this);
12412 }
12413}
@ ITEM_FIELD_DURATION
Definition: UpdateFields.h:40
void SendTimeUpdate(Player *owner)
Definition: Item.cpp:1076
ItemDurationList m_itemDuration
Definition: Player.h:2799

References Object::GetUInt32Value(), ITEM_FIELD_DURATION, m_itemDuration, and Item::SendTimeUpdate().

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddItemToBuyBackSlot()

void Player::AddItemToBuyBackSlot ( Item pItem,
uint32  money 
)
3952{
3953 if (pItem)
3954 {
3956 // if current back slot non-empty search oldest or free
3957 if (m_items[slot])
3958 {
3960 uint32 oldest_slot = BUYBACK_SLOT_START;
3961
3962 for (uint32 i = BUYBACK_SLOT_START + 1; i < BUYBACK_SLOT_END; ++i)
3963 {
3964 // found empty
3965 if (!m_items[i])
3966 {
3967 slot = i;
3968 break;
3969 }
3970
3972
3973 if (oldest_time > i_time)
3974 {
3975 oldest_time = i_time;
3976 oldest_slot = i;
3977 }
3978 }
3979
3980 // find oldest
3981 slot = oldest_slot;
3982 }
3983
3984 RemoveItemFromBuyBackSlot(slot, true);
3985 LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = {}, slot = {}", pItem->GetEntry(), slot);
3986
3987 m_items[slot] = pItem;
3988 time_t base = GameTime::GetGameTime().count();
3989 uint32 etime = uint32(base - m_logintime + (30 * 3600));
3990 uint32 eslot = slot - BUYBACK_SLOT_START;
3991
3995
3996 // move to next (for non filled list is move most optimized choice)
3999 }
4000}
@ PLAYER_FIELD_BUYBACK_PRICE_1
Definition: UpdateFields.h:372
@ PLAYER_FIELD_VENDORBUYBACK_SLOT_1
Definition: UpdateFields.h:331
@ PLAYER_FIELD_BUYBACK_TIMESTAMP_1
Definition: UpdateFields.h:373
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
Definition: PlayerStorage.cpp:4010

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, Object::GetEntry(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetUInt32Value(), LOG_DEBUG, m_currentBuybackSlot, m_items, m_logintime, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, RemoveItemFromBuyBackSlot(), Object::SetGuidValue(), and Unit::SetUInt32Value().

Referenced by WorldSession::HandleSellItemOpcode().

◆ AdditionalSavingAddMask()

◆ AddKnownCurrency()

void Player::AddKnownCurrency ( uint32  itemId)
private
14160{
14161 if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId))
14162 SetFlag64(PLAYER_FIELD_KNOWN_CURRENCIES, (1LL << (ctEntry->BitIndex - 1)));
14163}
DBCStorage< CurrencyTypesEntry > sCurrencyTypesStore(CurrencyTypesfmt)
void SetFlag64(uint16 index, uint64 newFlag)
Definition: Object.cpp:956
Definition: DBCStructure.h:835

References PLAYER_FIELD_KNOWN_CURRENCIES, sCurrencyTypesStore, and Object::SetFlag64().

Referenced by _StoreItem(), SetArenaPoints(), and SetHonorPoints().

◆ AddMail()

void Player::AddMail ( Mail mail)
inline
1632{ m_mail.push_front(mail); }// for call from WorldSession::SendMailTo

References m_mail.

Referenced by MailDraft::SendMailTo().

◆ AddMItem()

void Player::AddMItem ( Item it)
inline
1658 {
1659 ASSERT(it);
1660 //ASSERT deleted, because items can be added before loading
1661 mMitems[it->GetGUID().GetCounter()] = it;
1662 }

References ASSERT, ObjectGuid::GetCounter(), Object::GetGUID(), and mMitems.

Referenced by _LoadMailedItem(), and MailDraft::SendMailTo().

◆ AddNewMailDeliverTime()

void Player::AddNewMailDeliverTime ( time_t  deliver_time)
2877{
2878 if (deliver_time <= GameTime::GetGameTime().count()) // ready now
2879 {
2880 ++unReadMails;
2881 SendNewMail();
2882 }
2883 else // not ready and no have ready mails
2884 {
2885 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time)
2886 m_nextMailDelivereTime = deliver_time;
2887 }
2888}
void SendNewMail()
Definition: Player.cpp:2868

References GameTime::GetGameTime(), m_nextMailDelivereTime, SendNewMail(), and unReadMails.

Referenced by MailDraft::SendMailTo().

◆ AddQuest()

void Player::AddQuest ( Quest const *  quest,
Object questGiver 
)
507{
508 uint16 log_slot = FindQuestSlot(0);
509
510 if (log_slot >= MAX_QUEST_LOG_SIZE) // Player does not have any free slot in the quest log
511 return;
512
513 uint32 quest_id = quest->GetQuestId();
514
515 // if not exist then created with set uState == NEW and rewarded=false
516 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
517
518 // check for repeatable quests status reset
519 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
520 questStatusData.Explored = false;
521
522 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
523 {
524 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
525 questStatusData.ItemCount[i] = 0;
526 }
527
529 {
530 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
531 questStatusData.CreatureOrGOCount[i] = 0;
532 }
533
534 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
535 questStatusData.PlayerCount = 0;
536
537 GiveQuestSourceItem(quest);
538 AdjustQuestReqItemCount(quest, questStatusData);
539
540 if (quest->GetRepObjectiveFaction())
541 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction()))
542 GetReputationMgr().SetVisible(factionEntry);
543
544 if (quest->GetRepObjectiveFaction2())
545 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction2()))
546 GetReputationMgr().SetVisible(factionEntry);
547
548 uint32 qtime = 0;
549 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
550 {
551 uint32 timeAllowed = quest->GetTimeAllowed();
552
553 // shared timed quest
554 if (questGiver && questGiver->IsPlayer())
555 timeAllowed = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
556
557 AddTimedQuest(quest_id);
558 questStatusData.Timer = timeAllowed * IN_MILLISECONDS;
559 qtime = static_cast<uint32>(GameTime::GetGameTime().count()) + timeAllowed;
560 }
561 else
562 questStatusData.Timer = 0;
563
564 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
565 {
566 pvpInfo.IsHostile = true;
568 }
569
570 SetQuestSlot(log_slot, quest_id, qtime);
571
572 m_QuestStatusSave[quest_id] = true;
573
575
576 SendQuestUpdate(quest_id);
577
578 // check if Quest Tracker is enabled
579 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
580 {
581 // prepare Quest Tracker datas
582 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
583 stmt->SetData(0, quest_id);
584 stmt->SetData(1, GetGUID().GetCounter());
585 stmt->SetData(2, GitRevision::GetHash());
586 stmt->SetData(3, GitRevision::GetDate());
587
588 // add to Quest Tracker
589 CharacterDatabase.Execute(stmt);
590 }
591
592 // Xinef: area auras may change on quest accept!
595}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ QUEST_FLAGS_FLAGS_PVP
Definition: QuestDef.h:145
@ QUEST_SPECIAL_FLAGS_CAST
Definition: QuestDef.h:165
@ QUEST_SPECIAL_FLAGS_DELIVER
Definition: QuestDef.h:174
@ QUEST_SPECIAL_FLAGS_KILL
Definition: QuestDef.h:176
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition: QuestDef.h:175
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition: QuestDef.h:178
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition: IWorld.h:152
@ CHAR_INS_QUEST_TRACK
Definition: CharacterDatabase.h:498
@ ACHIEVEMENT_TIMED_TYPE_QUEST
Definition: DBCEnums.h:111
AC_COMMON_API char const * GetDate()
Definition: GitRevision.cpp:26
AC_COMMON_API char const * GetHash()
Definition: GitRevision.cpp:21
bool IsPlayer() const
Definition: Object.h:197
Player * ToPlayer()
Definition: Object.h:198
uint32 GetAreaId() const
Definition: Object.cpp:3149
bool IsHostile
Definition: Player.h:360
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: Player.cpp:13868
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1610
uint16 FindQuestSlot(uint32 quest_id) const
Definition: PlayerQuest.cpp:1776
void UpdatePvPState()
Definition: PlayerUpdates.cpp:1390
void UpdateAreaDependentAuras(uint32 area_id)
Definition: PlayerUpdates.cpp:1817
void SendQuestUpdate(uint32 questId)
Definition: PlayerQuest.cpp:1520
void AdjustQuestReqItemCount(Quest const *quest, QuestStatusData &questStatusData)
Definition: PlayerQuest.cpp:1758
PvPInfo pvpInfo
Definition: Player.h:1823
void UpdateZoneDependentAuras(uint32 zone_id)
Definition: PlayerUpdates.cpp:1803
bool GiveQuestSourceItem(Quest const *quest)
Definition: PlayerQuest.cpp:1329
ReputationMgr & GetReputationMgr()
Definition: Player.h:2101
void SetVisible(FactionTemplateEntry const *factionTemplateEntry)
Definition: ReputationMgr.cpp:458
Definition: DBCStructure.h:907

References ACHIEVEMENT_TIMED_TYPE_QUEST, AddTimedQuest(), AdjustQuestReqItemCount(), CHAR_INS_QUEST_TRACK, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, FindQuestSlot(), WorldObject::GetAreaId(), GitRevision::GetDate(), GameTime::GetGameTime(), Object::GetGUID(), GitRevision::GetHash(), Quest::GetQuestId(), getQuestStatusMap(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), GetReputationMgr(), Quest::GetTimeAllowed(), WorldObject::GetZoneId(), GiveQuestSourceItem(), Quest::HasFlag(), Quest::HasSpecialFlag(), IN_MILLISECONDS, PvPInfo::IsHostile, Object::IsPlayer(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QuestStatusData::PlayerCount, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, SendQuestUpdate(), SetQuestSlot(), ReputationMgr::SetVisible(), sFactionStore, StartTimedAchievement(), QuestStatusData::Status, sWorld, QuestStatusData::Timer, Object::ToPlayer(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion().

◆ AddQuestAndCheckCompletion()

void Player::AddQuestAndCheckCompletion ( Quest const *  quest,
Object questGiver 
)
421{
422 AddQuest(quest, questGiver);
423
424 if (CanCompleteQuest(quest->GetQuestId()))
425 CompleteQuest(quest->GetQuestId());
426
427 if (!questGiver)
428 return;
429
430 switch (questGiver->GetTypeId())
431 {
432 case TYPEID_UNIT:
433 sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest);
434 questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
435 break;
436 case TYPEID_ITEM:
437 case TYPEID_CONTAINER:
438 {
439 Item* item = (Item*)questGiver;
440 sScriptMgr->OnQuestAccept(this, item, quest);
441
442 // destroy not required for quest finish quest starting item
443 bool destroyItem = true;
444 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
445 {
446 if (quest->RequiredItemId[i] == item->GetEntry() && item->GetTemplate()->MaxCount > 0)
447 {
448 destroyItem = false;
449 break;
450 }
451 }
452
453 if (destroyItem)
454 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
455
456 break;
457 }
459 sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
460 questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
461 break;
462 default:
463 break;
464 }
465}
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:37
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEID_ITEM
Definition: ObjectGuid.h:33
@ TYPEID_CONTAINER
Definition: ObjectGuid.h:34
virtual bool QuestAccept(Player *, Quest const *)
Definition: GameObjectAI.h:58
virtual void sQuestAccept(Player *, Quest const *)
Definition: UnitAI.h:416
CreatureAI * AI() const
Definition: Creature.h:143
GameObjectAI * AI() const
Definition: GameObject.h:307
int32 MaxCount
Definition: ItemTemplate.h:644
TypeID GetTypeId() const
Definition: Object.h:124
GameObject * ToGameObject()
Definition: Object.h:208
Creature * ToCreature()
Definition: Object.h:201
void AddQuest(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:506
void CompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:597
void DestroyItem(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:3038
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition: PlayerQuest.cpp:288

References AddQuest(), Creature::AI(), GameObject::AI(), CanCompleteQuest(), CompleteQuest(), DestroyItem(), Item::GetBagSlot(), Object::GetEntry(), Quest::GetQuestId(), Item::GetSlot(), Item::GetTemplate(), Object::GetTypeId(), ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, GameObjectAI::QuestAccept(), Quest::RequiredItemId, UnitAI::sQuestAccept(), sScriptMgr, Object::ToCreature(), Object::ToGameObject(), TYPEID_CONTAINER, TYPEID_GAMEOBJECT, TYPEID_ITEM, and TYPEID_UNIT.

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ AddReceivedSpectatorResetFor()

void Player::AddReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2561{ m_receivedSpectatorResetFor.insert(guid); }
GuidSet m_receivedSpectatorResetFor
Definition: Player.h:2565

References m_receivedSpectatorResetFor.

Referenced by ArenaSpectator::HandleResetCommand().

◆ AddRefundReference()

void Player::AddRefundReference ( ObjectGuid  itemGUID)
15458{
15459 m_refundableItems.insert(itemGUID);
15460}

References m_refundableItems.

Referenced by _LoadItem(), and _StoreOrEquipNewItem().

◆ AddRuneByAuraEffect()

void Player::AddRuneByAuraEffect ( uint8  index,
RuneType  newType,
AuraEffect const *  aura 
)
inline
2495{ SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
void ConvertRune(uint8 index, RuneType newType)
Definition: Player.cpp:13364
void SetRuneConvertAura(uint8 index, AuraEffect const *aura)
Definition: Player.h:2494

References ConvertRune(), and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune().

◆ AddRunePower()

void Player::AddRunePower ( uint8  index)
13387{
13389 data << uint32(1 << index); // mask (0x00-0x3F probably)
13390 GetSession()->SendPacket(&data);
13391}
@ SMSG_ADD_RUNE_POWER
Definition: Opcodes.h:1190

References GetSession(), WorldSession::SendPacket(), and SMSG_ADD_RUNE_POWER.

◆ addSpell()

bool Player::addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  updateActive,
bool  temporary = false,
bool  learnFromSkill = false 
)
3036{
3037 if (!_addSpell(spellId, addSpecMask, temporary, learnFromSkill))
3038 return false;
3039
3040 if (!updateActive)
3041 return true;
3042
3043 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); // must exist, checked in _addSpell
3044
3045 // pussywizard: now update active state for all ranks of this spell! and send packet to swap on action bar
3046 // pussywizard: assumption - it's in all specs, can't be a talent
3047 if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
3048 {
3049 SpellInfo const* nextSpellInfo = sSpellMgr->GetSpellInfo(sSpellMgr->GetFirstSpellInChain(spellInfo->Id));
3050 while (nextSpellInfo)
3051 {
3052 PlayerSpellMap::iterator itr = m_spells.find(nextSpellInfo->Id);
3053 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active)
3054 {
3055 if (nextSpellInfo->GetRank() < spellInfo->GetRank())
3056 {
3057 itr->second->Active = false;
3058 if (IsInWorld())
3059 {
3061 data << uint32(nextSpellInfo->Id);
3062 data << uint32(spellInfo->Id);
3063 GetSession()->SendPacket(&data);
3064 }
3065 return false;
3066 }
3067 else if (nextSpellInfo->GetRank() > spellInfo->GetRank())
3068 {
3069 PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id);
3070 if (itr2 != m_spells.end())
3071 itr2->second->Active = false;
3072 return false;
3073 }
3074 }
3075 nextSpellInfo = nextSpellInfo->GetNextRankSpell();
3076 }
3077 }
3078
3079 return true;
3080}
@ SMSG_SUPERCEDED_SPELL
Definition: Opcodes.h:330
uint8 GetRank() const
Definition: SpellInfo.cpp:2493
bool IsRanked() const
Definition: SpellInfo.cpp:2488
bool IsStackableWithRanks() const
Definition: SpellInfo.cpp:1144
SpellInfo const * GetNextRankSpell() const
Definition: SpellInfo.cpp:2512

References _addSpell(), SpellInfo::GetNextRankSpell(), SpellInfo::GetRank(), GetSession(), SpellInfo::Id, Object::IsInWorld(), SpellInfo::IsRanked(), SpellInfo::IsStackableWithRanks(), m_spells, PLAYERSPELL_REMOVED, WorldSession::SendPacket(), SMSG_SUPERCEDED_SPELL, and sSpellMgr.

Referenced by _LoadSpells(), LearnCustomSpells(), learnSkillRewardedSpells(), and learnSpell().

◆ AddSpellAndCategoryCooldowns()

void Player::AddSpellAndCategoryCooldowns ( SpellInfo const *  spellInfo,
uint32  itemId,
Spell spell = nullptr,
bool  infinityCooldown = false 
)
10864{
10865 // init cooldown values
10866 uint32 cat = 0;
10867 int32 rec = -1;
10868 int32 catrec = -1;
10869
10870 // some special item spells without correct cooldown in SpellInfo
10871 // cooldown information stored in item prototype
10872 // This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
10873
10874 if (itemId)
10875 {
10876 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
10877 {
10878 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
10879 {
10880 if (uint32(proto->Spells[idx].SpellId) == spellInfo->Id)
10881 {
10882 cat = proto->Spells[idx].SpellCategory;
10883 rec = proto->Spells[idx].SpellCooldown;
10884 catrec = proto->Spells[idx].SpellCategoryCooldown;
10885 break;
10886 }
10887 }
10888 }
10889 }
10890
10891 // if no cooldown found above then base at DBC data
10892 if (rec < 0 && catrec < 0)
10893 {
10894 cat = spellInfo->GetCategory();
10895 rec = spellInfo->RecoveryTime;
10896 catrec = spellInfo->CategoryRecoveryTime;
10897 }
10898
10899 time_t catrecTime;
10900 time_t recTime;
10901
10902 bool needsCooldownPacket = false;
10903
10904 // overwrite time for selected category
10905 if (infinityCooldown)
10906 {
10907 // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped)
10908 // but not allow ignore until reset or re-login
10909 catrecTime = catrec > 0 ? infinityCooldownDelay : 0;
10910 recTime = rec > 0 ? infinityCooldownDelay : catrecTime;
10911 }
10912 else
10913 {
10914 // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
10915 // prevent 0 cooldowns set by another way
10916 if (rec <= 0 && catrec <= 0 && (cat == 76 || (spellInfo->IsAutoRepeatRangedSpell() && spellInfo->Id != 75)))
10918
10919 // Now we have cooldown data (if found any), time to apply mods
10920 if (rec > 0)
10921 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
10922
10923 if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
10924 {
10925 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
10926 }
10927
10929 {
10930 // Apply SPELL_AURA_MOD_COOLDOWN only to own spells
10931 if (HasSpell(spellInfo->Id))
10932 {
10933 needsCooldownPacket = true;
10934 rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
10935 }
10936 }
10937
10938 // replace negative cooldowns by 0
10939 if (rec < 0) rec = 0;
10940 if (catrec < 0) catrec = 0;
10941
10942 // no cooldown after applying spell mods
10943 if (rec == 0 && catrec == 0)
10944 return;
10945
10946 catrecTime = catrec ? catrec : 0;
10947 recTime = rec ? rec : catrecTime;
10948 }
10949
10950 // category spells
10951 if (cat && catrec > 0)
10952 {
10953 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
10954 if (needsCooldownPacket)
10955 {
10956 WorldPacket data;
10957 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
10958 SendDirectMessage(&data);
10959 }
10960
10961 PacketCooldowns forcedCategoryCooldowns;
10962
10963 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
10964 if (i_scstore != sSpellsByCategoryStore.end())
10965 {
10966 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
10967 {
10968 if (i_scset->second == spellInfo->Id) // skip main spell, already handled above
10969 {
10970 continue;
10971 }
10972
10973 // If spell category is applied by item, then other spells should be exists in item templates
10974 if ((itemId > 0) != i_scset->first)
10975 {
10976 continue;
10977 }
10978
10979 // Only within the same spellfamily
10980 SpellInfo const* categorySpellInfo = sSpellMgr->GetSpellInfo(i_scset->second);
10981 if (!categorySpellInfo || categorySpellInfo->SpellFamilyName != spellInfo->SpellFamilyName)
10982 {
10983 continue;
10984 }
10985
10986 _AddSpellCooldown(i_scset->second, cat, itemId, catrecTime, !spellInfo->IsCooldownStartedOnEvent() && catrec && rec && catrec != rec);
10987
10988 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS))
10989 {
10990 forcedCategoryCooldowns[i_scset->second] = catrecTime;
10991 }
10992 }
10993 }
10994
10995 if (!forcedCategoryCooldowns.empty())
10996 {
10997 WorldPacket data;
10998 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, forcedCategoryCooldowns);
10999 SendDirectMessage(&data);
11000 }
11001 }
11002 else
11003 {
11004 // self spell cooldown
11005 if (recTime > 0)
11006 {
11007 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11008
11009 if (needsCooldownPacket)
11010 {
11011 WorldPacket data;
11012 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, rec);
11013 SendDirectMessage(&data);
11014 }
11015 }
11016 }
11017}
SpellCategoryStore sSpellsByCategoryStore
Definition: DBCStores.cpp:152
@ SPELLMOD_COOLDOWN
Definition: SpellDefines.h:88
@ SPELL_AURA_MOD_COOLDOWN
Definition: SpellAuraDefines.h:259
@ SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS
Definition: SpellInfo.h:204
#define MAX_ITEM_SPELLS
Definition: Item.h:215
static constexpr uint32 infinityCooldownDelay
Definition: Unit.h:46
@ SPELL_COOLDOWN_FLAG_NONE
Definition: Unit.h:616
std::unordered_map< uint32, uint32 > PacketCooldowns
Definition: Unit.h:621
@ SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS
Definition: SharedDefines.h:635
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5648
void ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
Definition: Player.cpp:9685
void BuildCooldownPacket(WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
Definition: Unit.cpp:20888
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:812
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5861
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References _AddSpellCooldown(), ApplySpellMod(), Unit::BuildCooldownPacket(), SpellInfo::CategoryRecoveryTime, Unit::GetAttackTime(), SpellInfo::GetCategory(), Unit::GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasSpell(), SpellInfo::Id, IN_MILLISECONDS, infinityCooldownDelay, SpellInfo::IsAutoRepeatRangedSpell(), SpellInfo::IsCooldownStartedOnEvent(), MAX_ITEM_SPELLS, RANGED_ATTACK, SpellInfo::RecoveryTime, SendDirectMessage(), sObjectMgr, SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS, SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS, SPELL_AURA_MOD_COOLDOWN, SPELL_COOLDOWN_FLAG_NONE, SpellInfo::SpellFamilyName, SPELLMOD_COOLDOWN, sSpellMgr, and sSpellsByCategoryStore.

Referenced by Aura::_ApplyForTarget(), Unit::AddGameObject(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), SendCooldownEvent(), Spell::SendSpellCooldown(), and Unit::SetMinion().

◆ AddSpellCooldown()

void Player::AddSpellCooldown ( uint32  spell_id,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
overridevirtual

◆ AddSpellMod()

void Player::AddSpellMod ( SpellModifier mod,
bool  apply 
)
9844{
9845 LOG_DEBUG("spells.aura", "Player::AddSpellMod {}", mod->spellId);
9847
9848 int i = 0;
9849 flag96 _mask = 0;
9850 for (int eff = 0; eff < 96; ++eff)
9851 {
9852 if (eff != 0 && eff % 32 == 0)
9853 _mask[i++] = 0;
9854
9855 _mask[i] = uint32(1) << (eff - (32 * i));
9856 if (mod->mask & _mask)
9857 {
9858 int32 val = 0;
9859 for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
9860 {
9861 if ((*itr)->type == mod->type && (*itr)->mask & _mask)
9862 val += (*itr)->value;
9863 }
9864 val += apply ? mod->value : -(mod->value);
9865 WorldPacket data(Opcode, (1 + 1 + 4));
9866 data << uint8(eff);
9867 data << uint8(mod->op);
9868 data << int32(val);
9869 SendDirectMessage(&data);
9870 }
9871 }
9872
9873 if (apply)
9874 {
9875 m_spellMods[mod->op].push_back(mod);
9877 m_spellMods[mod->op].sort(MageSpellModPred());
9878 else
9879 m_spellMods[mod->op].sort(SpellModPred());
9880 }
9881 else
9882 {
9883 m_spellMods[mod->op].remove(mod);
9884 // mods bound to aura will be removed in AuraEffect::~AuraEffect
9885 if (!mod->ownerAura)
9886 delete mod;
9887 }
9888}
@ SPELLMOD_FLAT
Definition: Player.h:93
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ SMSG_SET_FLAT_SPELL_MODIFIER
Definition: Opcodes.h:644
@ SMSG_SET_PCT_SPELL_MODIFIER
Definition: Opcodes.h:645
void apply(T *val)
Definition: ByteConverter.h:40
Definition: Util.h:451
Definition: Player.cpp:9817
Definition: Player.cpp:9828
SpellModOp op
Definition: Player.h:183
SpellModType type
Definition: Player.h:184
int32 value
Definition: Player.h:186
uint32 spellId
Definition: Player.h:188
Aura *const ownerAura
Definition: Player.h:189
flag96 mask
Definition: Player.h:187
SpellModList m_spellMods[MAX_SPELLMOD]
Definition: Player.h:2794

References CLASS_CONTEXT_ABILITY, CLASS_MAGE, IsClass(), LOG_DEBUG, m_spellMods, SpellModifier::mask, SpellModifier::op, SpellModifier::ownerAura, SendDirectMessage(), SMSG_SET_FLAT_SPELL_MODIFIER, SMSG_SET_PCT_SPELL_MODIFIER, SpellModifier::spellId, SPELLMOD_FLAT, SpellModifier::type, and SpellModifier::value.

Referenced by AuraEffect::ApplySpellMod().

◆ addTalent()

bool Player::addTalent ( uint32  spellId,
uint8  addSpecMask,
uint8  oldTalentRank 
)
2891{
2892 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2893 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, true))
2894 return false;
2895
2896 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
2897 if (!talentPos)
2898 return false;
2899
2900 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentPos->talent_id);
2901 if (!talentInfo)
2902 return false;
2903
2904 // xinef: remove old talent rank if any
2905 if (oldTalentRank)
2906 {
2907 _removeTalent(talentInfo->RankID[oldTalentRank - 1], addSpecMask);
2908 _removeTalentAurasAndSpells(talentInfo->RankID[oldTalentRank - 1]);
2909 SendLearnPacket(talentInfo->RankID[oldTalentRank - 1], false);
2910 }
2911
2912 // xinef: add talent auras and spells
2913 if (GetActiveSpecMask() & addSpecMask)
2914 _addTalentAurasAndSpells(spellId);
2915
2916 // xinef: find the spell on our talent map
2917 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2918
2919 // xinef: we do not have such a spell on our talent map
2920 if (itr == m_talents.end())
2921 {
2923 PlayerTalent* newTalent = new PlayerTalent();
2924 newTalent->State = state;
2925 newTalent->specMask = addSpecMask;
2926 newTalent->talentID = talentInfo->TalentID;
2927 newTalent->inSpellBook = talentInfo->addToSpellBook && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL);
2928
2929 m_talents[spellId] = newTalent;
2930 return true;
2931 }
2932 // xinef: if current mask does not cover addMask, add it to iterator and save changes to DB
2933 else if (!(itr->second->specMask & addSpecMask))
2934 {
2935 itr->second->specMask |= addSpecMask;
2936 if (itr->second->State != PLAYERSPELL_NEW)
2937 itr->second->State = PLAYERSPELL_CHANGED;
2938
2939 return true;
2940 }
2941
2942 return false;
2943}
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
PlayerSpellState
Definition: Player.h:118
Definition: Player.h:135
PlayerSpellState State
Definition: Player.h:136
bool inSpellBook
Definition: Player.h:139
uint32 talentID
Definition: Player.h:138
uint8 specMask
Definition: Player.h:137
Definition: DBCStructure.h:1923
std::array< uint32, MAX_TALENT_RANK > RankID
Definition: DBCStructure.h:1928
uint32 TalentID
Definition: DBCStructure.h:1924
uint32 addToSpellBook
Definition: DBCStructure.h:1934
uint16 talent_id
Definition: DBCStructure.h:2236

References _addTalentAurasAndSpells(), _removeTalent(), _removeTalentAurasAndSpells(), TalentEntry::addToSpellBook, SpellMgr::CheckSpellValid(), GetActiveSpecMask(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), PlayerTalent::inSpellBook, isBeingLoaded(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_UNCHANGED, TalentEntry::RankID, SendLearnPacket(), PlayerTalent::specMask, SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, sTalentStore, PlayerTalent::State, TalentSpellPos::talent_id, PlayerTalent::talentID, and TalentEntry::TalentID.

Referenced by _LoadTalents(), and LearnTalent().

◆ AddTimedQuest()

void Player::AddTimedQuest ( uint32  quest_id)
inline
1544{ m_timedquests.insert(quest_id); }
QuestSet m_timedquests
Definition: Player.h:2659

References m_timedquests.

Referenced by _LoadQuestStatus(), and AddQuest().

◆ AddToWorld()

void Player::AddToWorld ( )
overridevirtual
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be added when logging in

Reimplemented from WorldObject.

1698{
1703
1704 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1705 if (m_items[i])
1706 m_items[i]->AddToWorld();
1707}
@ PLAYER_SLOT_START
Definition: Player.h:664
@ PLAYER_SLOT_END
Definition: Player.h:666
void AddToWorld() override
Definition: Unit.cpp:15615

References Object::AddToWorld(), Unit::AddToWorld(), m_items, PLAYER_SLOT_END, and PLAYER_SLOT_START.

Referenced by Map::AddPlayerToMap().

◆ AddTradeableItem()

void Player::AddTradeableItem ( Item item)
4148{
4149 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4150 m_itemSoulboundTradeable.push_back(item);
4151}
std::mutex m_soulboundTradableLock
Definition: Player.h:2801
ItemDurationList m_itemSoulboundTradeable
Definition: Player.h:2800

References m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by _LoadItem(), MoveItemToInventory(), and StoreNewItem().

◆ AddWeaponProficiency()

void Player::AddWeaponProficiency ( uint32  newflag)
inline
1349{ m_WeaponProficiency |= newflag; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ AddWhisperWhiteList()

void Player::AddWhisperWhiteList ( ObjectGuid  guid)
inline
2535{ WhisperList.push_back(guid); }
WhisperListContainer WhisperList
Definition: Player.h:2613

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ AdjustQuestReqItemCount()

void Player::AdjustQuestReqItemCount ( Quest const *  quest,
QuestStatusData questStatusData 
)
private
1759{
1760 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1761 {
1762 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
1763 {
1764 uint32 reqitemcount = quest->RequiredItemCount[i];
1765 if (reqitemcount != 0)
1766 {
1767 uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
1768
1769 questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
1770 m_QuestStatusSave[quest->GetQuestId()] = true;
1771 }
1772 }
1773 }
1774}
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:350

References GetItemCount(), Quest::GetQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatusSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by AddQuest().

◆ ApplyEnchantment() [1/2]

void Player::ApplyEnchantment ( Item item,
bool  apply 
)
4314{
4315 for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4316 ApplyEnchantment(item, EnchantmentSlot(slot), apply);
4317}

References ApplyEnchantment(), and MAX_ENCHANTMENT_SLOT.

◆ ApplyEnchantment() [2/2]

void Player::ApplyEnchantment ( Item item,
EnchantmentSlot  slot,
bool  apply,
bool  apply_dur = true,
bool  ignore_condition = false 
)
4320{
4321 if (!item || !item->IsEquipped())
4322 return;
4323
4324 if (slot >= MAX_ENCHANTMENT_SLOT)
4325 return;
4326
4327 uint32 enchant_id = item->GetEnchantmentId(slot);
4328 if (!enchant_id)
4329 return;
4330
4331 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
4332 if (!pEnchant)
4333 return;
4334
4335 if (!ignore_condition && pEnchant->EnchantmentCondition && !EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
4336 return;
4337
4338 if (pEnchant->requiredLevel > GetLevel())
4339 return;
4340
4341 if (pEnchant->requiredSkill > 0 && pEnchant->requiredSkillValue > GetSkillValue(pEnchant->requiredSkill))
4342 return;
4343
4344 if (!sScriptMgr->CanApplyEnchantment(this, item, slot, apply, apply_dur, ignore_condition))
4345 return;
4346
4347 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4348 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4350 && !item->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4351 {
4352 // Check if the requirements for the prismatic socket are met before applying the gem stats
4354 if (!pPrismaticEnchant || (pPrismaticEnchant->requiredSkill > 0 && pPrismaticEnchant->requiredSkillValue > GetSkillValue(pPrismaticEnchant->requiredSkill)))
4355 return;
4356 }
4357
4358 if (!item->IsBroken())
4359 {
4360 for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
4361 {
4362 uint32 enchant_display_type = pEnchant->type[s];
4363 uint32 enchant_amount = pEnchant->amount[s];
4364 uint32 enchant_spell_id = pEnchant->spellid[s];
4365
4366 switch (enchant_display_type)
4367 {
4369 break;
4371 // processed in Player::CastItemCombatSpell
4372 break;
4374 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4375 HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
4376 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4377 HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
4378 else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
4379 HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4380 break;
4382 if (enchant_spell_id)
4383 {
4384 if (apply)
4385 {
4386 int32 basepoints = 0;
4387 // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
4388 if (item->GetItemRandomPropertyId())
4389 {
4390 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4391 if (item_rand)
4392 {
4393 // Search enchant_amount
4394 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4395 {
4396 if (item_rand->Enchantment[k] == enchant_id)
4397 {
4398 basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4399 break;
4400 }
4401 }
4402 }
4403 }
4404 // Cast custom spell vs all equal basepoints got from enchant_amount
4405 if (basepoints)
4406 CastCustomSpell(this, enchant_spell_id, &basepoints, &basepoints, &basepoints, true, item);
4407 else
4408 CastSpell(this, enchant_spell_id, true, item);
4409 }
4410 else
4411 RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
4412 }
4413 break;
4415 if (!enchant_amount)
4416 {
4417 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4418 if (item_rand)
4419 {
4420 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4421 {
4422 if (item_rand->Enchantment[k] == enchant_id)
4423 {
4424 enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4425 break;
4426 }
4427 }
4428 }
4429 }
4430
4431 HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
4432 break;
4434 {
4435 if (!enchant_amount)
4436 {
4437 ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4438 if (item_rand_suffix)
4439 {
4440 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4441 {
4442 if (item_rand_suffix->Enchantment[k] == enchant_id)
4443 {
4444 enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4445 break;
4446 }
4447 }
4448 }
4449 }
4450
4451 sScriptMgr->OnApplyEnchantmentItemModsBefore(this, item, slot, apply, enchant_spell_id, enchant_amount);
4452
4453 LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
4454 switch (enchant_spell_id)
4455 {
4456 case ITEM_MOD_MANA:
4457 LOG_DEBUG("entities.player.items", "+ {} MANA", enchant_amount);
4458 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(enchant_amount), apply);
4459 break;
4460 case ITEM_MOD_HEALTH:
4461 LOG_DEBUG("entities.player.items", "+ {} HEALTH", enchant_amount);
4462 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(enchant_amount), apply);
4463 break;
4464 case ITEM_MOD_AGILITY:
4465 LOG_DEBUG("entities.player.items", "+ {} AGILITY", enchant_amount);
4466 HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
4467 ApplyStatBuffMod(STAT_AGILITY, (float)enchant_amount, apply);
4468 break;
4469 case ITEM_MOD_STRENGTH:
4470 LOG_DEBUG("entities.player.items", "+ {} STRENGTH", enchant_amount);
4471 HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
4472 ApplyStatBuffMod(STAT_STRENGTH, (float)enchant_amount, apply);
4473 break;
4474 case ITEM_MOD_INTELLECT:
4475 LOG_DEBUG("entities.player.items", "+ {} INTELLECT", enchant_amount);
4476 HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
4477 ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply);
4478 break;
4479 case ITEM_MOD_SPIRIT:
4480 LOG_DEBUG("entities.player.items", "+ {} SPIRIT", enchant_amount);
4481 HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
4482 ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply);
4483 break;
4484 case ITEM_MOD_STAMINA:
4485 LOG_DEBUG("entities.player.items", "+ {} STAMINA", enchant_amount);
4486 HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
4487 ApplyStatBuffMod(STAT_STAMINA, (float)enchant_amount, apply);
4488 break;
4490 ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
4491 LOG_DEBUG("entities.player.items", "+ {} DEFENCE", enchant_amount);
4492 break;
4494 ApplyRatingMod(CR_DODGE, enchant_amount, apply);
4495 LOG_DEBUG("entities.player.items", "+ {} DODGE", enchant_amount);
4496 break;
4498 ApplyRatingMod(CR_PARRY, enchant_amount, apply);
4499 LOG_DEBUG("entities.player.items", "+ {} PARRY", enchant_amount);
4500 break;
4502 ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
4503 LOG_DEBUG("entities.player.items", "+ {} SHIELD_BLOCK", enchant_amount);
4504 break;
4506 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4507 LOG_DEBUG("entities.player.items", "+ {} MELEE_HIT", enchant_amount);
4508 break;
4510 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4511 LOG_DEBUG("entities.player.items", "+ {} RANGED_HIT", enchant_amount);
4512 break;
4514 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4515 LOG_DEBUG("entities.player.items", "+ {} SPELL_HIT", enchant_amount);
4516 break;
4518 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4519 LOG_DEBUG("entities.player.items", "+ {} MELEE_CRIT", enchant_amount);
4520 break;
4522 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4523 LOG_DEBUG("entities.player.items", "+ {} RANGED_CRIT", enchant_amount);
4524 break;
4526 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4527 LOG_DEBUG("entities.player.items", "+ {} SPELL_CRIT", enchant_amount);
4528 break;
4529 // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
4530 // in Enchantments
4531 // case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
4532 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4533 // break;
4534 // case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
4535 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4536 // break;
4537 // case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
4538 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4539 // break;
4540 // case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
4541 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4542 // break;
4543 // case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
4544 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4545 // break;
4546 // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
4547 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4548 // break;
4549 // case ITEM_MOD_HASTE_MELEE_RATING:
4550 // ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4551 // break;
4553 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4554 break;
4556 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4557 break;
4559 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4560 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4561 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4562 LOG_DEBUG("entities.player.items", "+ {} HIT", enchant_amount);
4563 break;
4565 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4566 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4567 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4568 LOG_DEBUG("entities.player.items", "+ {} CRITICAL", enchant_amount);
4569 break;
4570 // Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
4571 // case ITEM_MOD_HIT_TAKEN_RATING:
4572 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4573 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4574 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4575 // break;
4576 // case ITEM_MOD_CRIT_TAKEN_RATING:
4577 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4578 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4579 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4580 // break;
4582 ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4583 ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4584 ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4585 LOG_DEBUG("entities.player.items", "+ {} RESILIENCE", enchant_amount);
4586 break;
4588 ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4589 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4590 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4591 LOG_DEBUG("entities.player.items", "+ {} HASTE", enchant_amount);
4592 break;
4594 ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
4595 LOG_DEBUG("entities.player.items", "+ {} EXPERTISE", enchant_amount);
4596 break;
4598 HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
4599 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4600 LOG_DEBUG("entities.player.items", "+ {} ATTACK_POWER", enchant_amount);
4601 break;
4603 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4604 LOG_DEBUG("entities.player.items", "+ {} RANGED_ATTACK_POWER", enchant_amount);
4605 break;
4606 // case ITEM_MOD_FERAL_ATTACK_POWER:
4607 // ApplyFeralAPBonus(enchant_amount, apply);
4608 // LOG_DEBUG("entities.player.items", "+ {} FERAL_ATTACK_POWER", enchant_amount);
4609 // break;
4611 ApplyManaRegenBonus(enchant_amount, apply);
4612 LOG_DEBUG("entities.player.items", "+ {} MANA_REGENERATION", enchant_amount);
4613 break;
4615 ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
4616 LOG_DEBUG("entities.player.items", "+ {} ARMOR PENETRATION", enchant_amount);
4617 break;
4619 ApplySpellPowerBonus(enchant_amount, apply);
4620 LOG_DEBUG("entities.player.items", "+ {} SPELL_POWER", enchant_amount);
4621 break;
4623 ApplyHealthRegenBonus(enchant_amount, apply);
4624 LOG_DEBUG("entities.player.items", "+ {} HEALTH_REGENERATION", enchant_amount);
4625 break;
4627 ApplySpellPenetrationBonus(enchant_amount, apply);
4628 LOG_DEBUG("entities.player.items", "+ {} SPELL_PENETRATION", enchant_amount);
4629 break;
4631 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(enchant_amount), apply);
4632 LOG_DEBUG("entities.player.items", "+ {} BLOCK_VALUE", enchant_amount);
4633 break;
4634 case ITEM_MOD_SPELL_HEALING_DONE: // deprecated
4635 case ITEM_MOD_SPELL_DAMAGE_DONE: // deprecated
4636 default:
4637 break;
4638 }
4639 break;
4640 }
4641 case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
4642 {
4644 {
4645 float addValue = 0.0f;
4646 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4647 {
4648 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4650 }
4651 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4652 {
4653 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4655 }
4656 }
4657 break;
4658 }
4660 // processed in Player::CastItemUseSpell
4661 break;
4663 // nothing do..
4664 break;
4665 default:
4666 LOG_ERROR("entities.player", "Unknown item enchantment (id = {}) display type: {}", enchant_id, enchant_display_type);
4667 break;
4668 } /*switch (enchant_display_type)*/
4669 } /*for*/
4670 }
4671
4672 // visualize enchantment at player and equipped items
4673 if (slot == PERM_ENCHANTMENT_SLOT)
4674 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
4675
4676 if (slot == TEMP_ENCHANTMENT_SLOT)
4677 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
4678
4679 if (apply_dur)
4680 {
4681 if (apply)
4682 {
4683 // set duration
4684 uint32 duration = item->GetEnchantmentDuration(slot);
4685 if (duration > 0)
4686 AddEnchantmentDuration(item, slot, duration);
4687 }
4688 else
4689 {
4690 // duration == 0 will remove EnchantDuration
4691 AddEnchantmentDuration(item, slot, 0);
4692 }
4693 }
4694}
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
@ PLAYER_VISIBLE_ITEM_1_ENCHANTMENT
Definition: UpdateFields.h:287
@ PERM_ENCHANTMENT_SLOT
Definition: Item.h:169
@ SOCK_ENCHANTMENT_SLOT_3
Definition: Item.h:173
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
@ SOCK_ENCHANTMENT_SLOT_2
Definition: Item.h:172
@ PRISMATIC_ENCHANTMENT_SLOT
Definition: Item.h:175
@ SOCK_ENCHANTMENT_SLOT
Definition: Item.h:171
@ UNIT_MOD_RESISTANCE_START
Definition: Unit.h:172
@ ITEM_ENCHANTMENT_TYPE_DAMAGE
Definition: DBCEnums.h:368
@ ITEM_ENCHANTMENT_TYPE_USE_SPELL
Definition: DBCEnums.h:373
@ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL
Definition: DBCEnums.h:367
@ ITEM_ENCHANTMENT_TYPE_STAT
Definition: DBCEnums.h:371
@ ITEM_ENCHANTMENT_TYPE_RESISTANCE
Definition: DBCEnums.h:370
@ ITEM_ENCHANTMENT_TYPE_NONE
Definition: DBCEnums.h:366
@ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL
Definition: DBCEnums.h:369
@ ITEM_ENCHANTMENT_TYPE_TOTEM
Definition: DBCEnums.h:372
@ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET
Definition: DBCEnums.h:374
#define MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1838
#define MAX_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1204
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
int32 GetItemRandomPropertyId() const
Definition: Item.h:295
uint32 GetItemSuffixFactor() const
Definition: Item.h:296
bool IsEquipped() const
Definition: Item.cpp:790
uint32 Color
Definition: ItemTemplate.h:602
uint32 Delay
Definition: ItemTemplate.h:659
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]
Definition: ItemTemplate.h:681
void SetUInt16Value(uint16 index, uint8 offset, uint16 value)
Definition: Object.cpp:770
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5393
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
Definition: Player.cpp:11075
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1211
void RemoveAurasDueToItemSpell(uint32 spellId, ObjectGuid castItemGuid)
Definition: Unit.cpp:5047
Definition: DBCStructure.h:1217
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > AllocationPct
Definition: DBCStructure.h:1224
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > Enchantment
Definition: DBCStructure.h:1222
Definition: DBCStructure.h:1841
uint32 EnchantmentCondition
Definition: DBCStructure.h:1853
uint32 amount[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1845
uint32 requiredLevel
Definition: DBCStructure.h:1856
uint32 spellid[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1847
uint32 requiredSkill
Definition: DBCStructure.h:1854
uint32 requiredSkillValue
Definition: DBCStructure.h:1855
uint32 type[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1844

References AddEnchantmentDuration(), ItemRandomSuffixEntry::AllocationPct, SpellItemEnchantmentEntry::amount, ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), BASE_VALUE, Unit::CastCustomSpell(), Unit::CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_SHAMAN, _Socket::Color, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_PARRY, ItemTemplate::Delay, ItemRandomSuffixEntry::Enchantment, SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, FLAT_MOD, Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), Object::GetGUID(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Unit::GetLevel(), GetSkillValue(), Item::GetSlot(), Item::GetTemplate(), HandleBaseModValue(), Unit::HandleStatModifier(), Item::IsBroken(), IsClass(), Item::IsEquipped(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_ENCHANTMENT_TYPE_DAMAGE, ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL, ITEM_ENCHANTMENT_TYPE_NONE, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET, ITEM_ENCHANTMENT_TYPE_RESISTANCE, ITEM_ENCHANTMENT_TYPE_STAT, ITEM_ENCHANTMENT_TYPE_TOTEM, ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, LOG_DEBUG, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_ENCHANTMENT_EFFECTS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, PERM_ENCHANTMENT_SLOT, PLAYER_VISIBLE_ITEM_1_ENCHANTMENT, PRISMATIC_ENCHANTMENT_SLOT, Unit::RemoveAurasDueToItemSpell(), SpellItemEnchantmentEntry::requiredLevel, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, Object::SetUInt16Value(), SHIELD_BLOCK_VALUE, sItemRandomSuffixStore, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, ItemTemplate::Socket, SpellItemEnchantmentEntry::spellid, sScriptMgr, sSpellItemEnchantmentStore, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, TEMP_ENCHANTMENT_SLOT, TOTAL_VALUE, SpellItemEnchantmentEntry::type, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_START, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), ApplyEnchantment(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Spell::EffectEnchantHeldItem(), Spell::EffectEnchantItemPerm(), Spell::EffectEnchantItemPrismatic(), Spell::EffectEnchantItemTmp(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleCancelTempEnchantmentOpcode(), WorldSession::HandleSocketOpcode(), RemoveArenaEnchantments(), SetVirtualItemSlot(), SwapItem(), ToggleMetaGemsActive(), UpdateEnchantTime(), and UpdateSkillEnchantments().

◆ ApplyEquipCooldown()

void Player::ApplyEquipCooldown ( Item pItem)
11724{
11726 return;
11727
11728 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
11729 {
11730 _Spell const& spellData = pItem->GetTemplate()->Spells[i];
11731
11732 // no spell
11733 if (!spellData.SpellId)
11734 continue;
11735
11736 // xinef: apply hidden cooldown for procs
11738 {
11739 // xinef: uint32(-1) special marker for proc cooldowns
11740 AddSpellCooldown(spellData.SpellId, uint32(-1), 30 * IN_MILLISECONDS);
11741 continue;
11742 }
11743
11744 // wrong triggering type (note: ITEM_SPELLTRIGGER_ON_NO_DELAY_USE not have cooldown)
11745 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
11746 continue;
11747
11748 // xinef: dont apply equip cooldown if spell on item has insignificant cooldown
11749 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
11750 if (spellData.SpellCooldown <= 3000 && spellData.SpellCategoryCooldown <= 3000 && (!spellInfo || (spellInfo->RecoveryTime <= 3000 && spellInfo->CategoryRecoveryTime <= 3000)))
11751 continue;
11752
11753 // Don't replace longer cooldowns by equip cooldown if we have any.
11754 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
11755 if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > GameTime::GetGameTimeMS().count() + 30 * IN_MILLISECONDS)
11756 continue;
11757
11758 // xinef: dont apply eqiup cooldown for spells with this attribute
11759 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL))
11760 continue;
11761
11762 AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), 30 * IN_MILLISECONDS, true, true);
11763
11765 data << pItem->GetGUID();
11766 data << uint32(spellData.SpellId);
11767 GetSession()->SendPacket(&data);
11768 }
11769}
@ ITEM_SPELLTRIGGER_ON_USE
Definition: ItemTemplate.h:77
@ ITEM_SPELLTRIGGER_ON_EQUIP
Definition: ItemTemplate.h:78
@ ITEM_FLAG_NO_EQUIP_COOLDOWN
Definition: ItemTemplate.h:154
#define MAX_ITEM_PROTO_SPELLS
Definition: ItemTemplate.h:615
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
Definition: SharedDefines.h:410
@ SMSG_ITEM_COOLDOWN
Definition: Opcodes.h:206
Definition: ItemTemplate.h:590
uint32 SpellTrigger
Definition: ItemTemplate.h:592
int32 SpellCategoryCooldown
Definition: ItemTemplate.h:597
int32 SpellCooldown
Definition: ItemTemplate.h:595
int32 SpellId
Definition: ItemTemplate.h:591
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
Definition: ItemTemplate.h:662
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11041
uint32 RecoveryTime
Definition: SpellInfo.h:348
uint32 CategoryRecoveryTime
Definition: SpellInfo.h:349

References AddSpellCooldown(), SpellInfo::CategoryRecoveryTime, Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetSession(), Item::GetTemplate(), SpellInfo::HasAttribute(), ItemTemplate::HasFlag(), IN_MILLISECONDS, ITEM_FLAG_NO_EQUIP_COOLDOWN, ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, m_spellCooldowns, MAX_ITEM_PROTO_SPELLS, SpellInfo::RecoveryTime, WorldSession::SendPacket(), SMSG_ITEM_COOLDOWN, SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL, _Spell::SpellCategoryCooldown, _Spell::SpellCooldown, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by EquipItem().

◆ ApplyEquipSpell()

void Player::ApplyEquipSpell ( SpellInfo const *  spellInfo,
Item item,
bool  apply,
bool  form_change = false 
)
7104{
7105 if (apply)
7106 {
7107 if (!sScriptMgr->CanApplyEquipSpell(this, spellInfo, item, apply, form_change))
7108 return;
7109
7110 // Cannot be used in this stance/form
7111 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) != SPELL_CAST_OK)
7112 return;
7113
7114 if (form_change) // check aura active state from other form
7115 {
7116 AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
7117 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
7118 if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
7119 return;
7120 }
7121
7122 LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id);
7123
7124 //Ignore spellInfo->DurationEntry, cast with -1 duration
7125 CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_DURATION, -1, this, true, item);
7126 }
7127 else
7128 {
7129 if (form_change) // check aura compatibility
7130 {
7131 // Cannot be used in this stance/form
7132 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) == SPELL_CAST_OK)
7133 return; // and remove only not compatible at form change
7134 }
7135
7136 if (item)
7137 RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
7138 else
7139 RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
7140
7141 // Xinef: Remove Proc Spells and Summons
7142 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
7143 {
7144 // Xinef: Remove procs
7145 if (spellInfo->Effects[i].TriggerSpell)
7146 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
7147
7148 // Xinef: remove minions summoned by item
7149 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SUMMON)
7150 RemoveAllMinionsByEntry(spellInfo->Effects[i].MiscValue);
7151 }
7152 }
7153}
@ SPELLVALUE_AURA_DURATION
Definition: SpellDefines.h:120
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:806
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1414
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:640
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1267
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10798

References Unit::CastCustomSpell(), SpellInfo::CheckShapeshift(), EFFECT_0, SpellInfo::Effects, Unit::GetAppliedAuras(), Object::GetGUID(), Unit::GetShapeshiftForm(), SpellInfo::Id, LOG_DEBUG, MAX_SPELL_EFFECTS, Unit::RemoveAllMinionsByEntry(), Unit::RemoveAurasDueToItemSpell(), Unit::RemoveAurasDueToSpell(), SPELL_CAST_OK, SPELL_EFFECT_SUMMON, SPELLVALUE_AURA_DURATION, and sScriptMgr.

Referenced by AddItemsSetItem(), ApplyItemEquipSpell(), RemoveItemsSetItem(), and UpdateEquipSpellsAtFormChange().

◆ ApplyFeralAPBonus()

void Player::ApplyFeralAPBonus ( int32  amount,
bool  apply 
)
325{
326 _ModifyUInt32(apply, m_baseFeralAP, amount);
328}
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
Definition: StatSystem.cpp:28
void UpdateAttackPowerAndDamage(bool ranged=false) override
Definition: StatSystem.cpp:330

References _ModifyUInt32(), m_baseFeralAP, and UpdateAttackPowerAndDamage().

Referenced by _ApplyItemBonuses().

◆ ApplyHealthRegenBonus()

void Player::ApplyHealthRegenBonus ( int32  amount,
bool  apply 
)
920{
921 _ModifyUInt32(apply, m_baseHealthRegen, amount);
922}

References _ModifyUInt32(), and m_baseHealthRegen.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyItemEquipSpell()

void Player::ApplyItemEquipSpell ( Item item,
bool  apply,
bool  form_change = false 
)
7053{
7054 if (!item)
7055 return;
7056
7057 ItemTemplate const* proto = item->GetTemplate();
7058 if (!proto)
7059 return;
7060
7061 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7062 {
7063 _Spell const& spellData = proto->Spells[i];
7064
7065 // no spell
7066 if (!spellData.SpellId)
7067 continue;
7068
7069 // Spells that should stay on the caster after removing the item.
7070 constexpr std::array<int32, 2> spellExceptions =
7071 {
7072 11826, //Electromagnetic Gigaflux Reactivator
7073 17490 //Book of the Dead - Summon Skeleton
7074 };
7075 const auto found = std::find(std::begin(spellExceptions), std::end(spellExceptions), spellData.SpellId);
7076
7077 // wrong triggering type
7078 if (apply)
7079 {
7081 {
7082 continue;
7083 }
7084 }
7085 else
7086 {
7087 // If the spell is an exception do not remove it.
7088 if (found != std::end(spellExceptions))
7089 {
7090 continue;
7091 }
7092 }
7093
7094 // check if it is valid spell
7095 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(spellData.SpellId);
7096 if (!spellproto)
7097 continue;
7098
7099 ApplyEquipSpell(spellproto, item, apply, form_change);
7100 }
7101}
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7103

References ApplyEquipSpell(), Item::GetTemplate(), ITEM_SPELLTRIGGER_ON_EQUIP, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and UpdateEquipSpellsAtFormChange().

◆ ApplyManaRegenBonus()

void Player::ApplyManaRegenBonus ( int32  amount,
bool  apply 
)
914{
915 _ModifyUInt32(apply, m_baseManaRegen, amount);
917}
void UpdateManaRegen()
Definition: StatSystem.cpp:924

References _ModifyUInt32(), m_baseManaRegen, and UpdateManaRegen().

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyRatingMod()

void Player::ApplyRatingMod ( CombatRating  cr,
int32  value,
bool  apply 
)
5203{
5204 float oldRating = m_baseRatingValue[cr];
5205 m_baseRatingValue[cr] += (apply ? value : -value);
5206 // explicit affected values
5207 if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
5208 {
5209 float const mult = GetRatingMultiplier(cr);
5210 float const oldVal = oldRating * mult;
5211 float const newVal = m_baseRatingValue[cr] * mult;
5212 switch (cr)
5213 {
5214 case CR_HASTE_MELEE:
5215 ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
5216 ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
5219 break;
5220 case CR_HASTE_RANGED:
5223 break;
5224 case CR_HASTE_SPELL:
5225 ApplyCastTimePercentMod(oldVal, false);
5226 ApplyCastTimePercentMod(newVal, true);
5227 break;
5228 default:
5229 break;
5230 }
5231 }
5232
5233 UpdateRating(cr);
5234}
float GetRatingMultiplier(CombatRating cr) const
Definition: Player.cpp:5125
void UpdateRating(CombatRating cr)
Definition: PlayerUpdates.cpp:571
void ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply)
Definition: Unit.cpp:16982
void ApplyCastTimePercentMod(float val, bool apply)
Definition: Unit.cpp:16998

References Unit::ApplyAttackTimePercentMod(), Unit::ApplyCastTimePercentMod(), BASE_ATTACK, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, GetRatingMultiplier(), m_baseRatingValue, OFF_ATTACK, RANGED_ATTACK, and UpdateRating().

Referenced by _ApplyItemBonuses(), ApplyEnchantment(), AuraEffect::HandleModRating(), AuraEffect::HandleModRatingFromStat(), RecalculateRating(), and UpdateStats().

◆ ApplySpellMod()

template<class T >
template AC_GAME_API void Player::ApplySpellMod ( uint32  spellId,
SpellModOp  op,
T &  basevalue,
Spell spell = nullptr,
bool  temporaryPet = false 
)
9686{
9687 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9688 if (!spellInfo)
9689 {
9690 return;
9691 }
9692
9693 float totalmul = 1.0f;
9694 int32 totalflat = 0;
9695
9696 auto calculateSpellMod = [&](SpellModifier* mod)
9697 {
9698 // xinef: temporary pets cannot use charged mods of owner, needed for mirror image QQ they should use their own auras
9699 if (temporaryPet && mod->charges != 0)
9700 {
9701 return;
9702 }
9703
9704 if (mod->type == SPELLMOD_FLAT)
9705 {
9706 // xinef: do not allow to consume more than one 100% crit increasing spell
9707 if (mod->op == SPELLMOD_CRITICAL_CHANCE && totalflat >= 100)
9708 {
9709 return;
9710 }
9711
9712 int32 flatValue = mod->value;
9713
9714 // SPELL_MOD_THREAT - divide by 100 (in packets we send threat * 100)
9715 if (mod->op == SPELLMOD_THREAT)
9716 {
9717 flatValue /= 100;
9718 }
9719
9720 totalflat += flatValue;
9721 }
9722 else if (mod->type == SPELLMOD_PCT)
9723 {
9724 // skip percent mods for null basevalue (most important for spell mods with charges)
9725 if (basevalue == T(0) || totalmul == 0.0f)
9726 {
9727 return;
9728 }
9729
9730 // special case (skip > 10sec spell casts for instant cast setting)
9731 if (mod->op == SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
9732 {
9733 return;
9734 }
9735 // xinef: special exception for surge of light, dont affect crit chance if previous mods were not applied
9736 else if (mod->op == SPELLMOD_CRITICAL_CHANCE && spell && !HasSpellMod(mod, spell))
9737 {
9738 return;
9739 }
9740 // xinef: special case for backdraft gcd reduce with backlast time reduction, dont affect gcd if cast time was not applied
9741 else if (mod->op == SPELLMOD_GLOBAL_COOLDOWN && spell && !HasSpellMod(mod, spell))
9742 {
9743 return;
9744 }
9745
9746 // xinef: those two mods should be multiplicative (Glyph of Renew)
9747 if (mod->op == SPELLMOD_DAMAGE || mod->op == SPELLMOD_DOT)
9748 {
9749 totalmul *= CalculatePct(1.0f, 100.0f + mod->value);
9750 }
9751 else
9752 {
9753 totalmul += CalculatePct(1.0f, mod->value);
9754 }
9755 }
9756
9757 DropModCharge(mod, spell);
9758 };
9759
9760 // Drop charges for triggering spells instead of triggered ones
9762 {
9763 spell = m_spellModTakingSpell;
9764 }
9765
9766 SpellModifier* chargedMod = nullptr;
9767 for (auto mod : m_spellMods[op])
9768 {
9769 // Charges can be set only for mods with auras
9770 if (!mod->ownerAura)
9771 {
9772 ASSERT(!mod->charges);
9773 }
9774
9775 if (!IsAffectedBySpellmod(spellInfo, mod, spell))
9776 {
9777 continue;
9778 }
9779
9780 if (mod->ownerAura->IsUsingCharges())
9781 {
9782 if (!chargedMod || (chargedMod->ownerAura->GetSpellInfo()->SpellPriority < mod->ownerAura->GetSpellInfo()->SpellPriority))
9783 {
9784 chargedMod = mod;
9785 }
9786
9787 continue;
9788 }
9789
9790 calculateSpellMod(mod);
9791 }
9792
9793 if (chargedMod)
9794 {
9795 calculateSpellMod(chargedMod);
9796 }
9797
9798 float diff = 0.0f;
9799 if (op == SPELLMOD_CASTING_TIME || op == SPELLMOD_DURATION)
9800 {
9801 diff = ((float)basevalue + totalflat) * (totalmul - 1.0f) + (float)totalflat;
9802 }
9803 else
9804 {
9805 diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat;
9806 }
9807
9808 basevalue = T((float)basevalue + diff);
9809}
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:77
@ SPELLMOD_DOT
Definition: SpellDefines.h:99
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:84
@ SPELLMOD_GLOBAL_COOLDOWN
Definition: SpellDefines.h:98
@ SPELLMOD_THREAT
Definition: SpellDefines.h:79
@ SPELLMOD_DURATION
Definition: SpellDefines.h:78
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:87
@ SPELLMOD_PCT
Definition: Player.h:94
T CalculatePct(T base, U pct)
Definition: Util.h:61
Definition: Player.h:181
void DropModCharge(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:10022
bool HasSpellMod(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:9660
bool IsAffectedBySpellmod(SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
Definition: Player.cpp:9668
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
uint32 SpellPriority
Definition: SpellInfo.h:382

References ASSERT, CalculatePct(), DropModCharge(), Aura::GetSpellInfo(), HasSpellMod(), IsAffectedBySpellmod(), m_spellMods, m_spellModTakingSpell, SpellModifier::ownerAura, SPELLMOD_CASTING_TIME, SPELLMOD_CRITICAL_CHANCE, SPELLMOD_DAMAGE, SPELLMOD_DOT, SPELLMOD_DURATION, SPELLMOD_FLAT, SPELLMOD_GLOBAL_COOLDOWN, SPELLMOD_PCT, SPELLMOD_THREAT, SpellInfo::SpellPriority, and sSpellMgr.

Referenced by AddSpellAndCategoryCooldowns(), Aura::CalcMaxDuration(), AuraEffect::CalculatePeriodic(), CastItemCombatSpell(), Spell::Delayed(), Spell::DelayedChannel(), and Spell::TriggerGlobalCooldown().

◆ ApplySpellPenetrationBonus()

void Player::ApplySpellPenetrationBonus ( int32  amount,
bool  apply 
)
220{
222 m_spellPenetrationItemMod += apply ? amount : -amount;
223}
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
Definition: UpdateFields.h:366
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:815

References Object::ApplyModInt32Value(), m_spellPenetrationItemMod, and PLAYER_FIELD_MOD_TARGET_RESISTANCE.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellPowerBonus()

void Player::ApplySpellPowerBonus ( int32  amount,
bool  apply 
)
168{
169 apply = _ModifyUInt32(apply, m_baseSpellPower, amount);
170
171 // For speed just update for client
173 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
175}
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
Definition: UpdateFields.h:363
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284

References _ModifyUInt32(), Object::ApplyModInt32Value(), Object::ApplyModUInt32Value(), m_baseSpellPower, MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, and SPELL_SCHOOL_HOLY.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ AreaExploredOrEventHappens()

void Player::AreaExploredOrEventHappens ( uint32  questId)
1786{
1787 if (questId)
1788 {
1789 uint16 log_slot = FindQuestSlot(questId);
1790 QuestStatusData* q_status = nullptr;
1791 if (log_slot < MAX_QUEST_LOG_SIZE)
1792 {
1793 q_status = &m_QuestStatus[questId];
1794
1795 // xinef: added failed check
1796 if (!q_status->Explored && q_status->Status != QUEST_STATUS_FAILED)
1797 {
1798 q_status->Explored = true;
1799 m_QuestStatusSave[questId] = true;
1800
1801 SendQuestComplete(questId);
1802 }
1803 }
1804 if (CanCompleteQuest(questId, q_status))
1805 CompleteQuest(questId);
1806 else
1808 }
1809}
@ ADDITIONAL_SAVING_QUEST_STATUS
Definition: Player.h:992
void SendQuestComplete(uint32 quest_id)
Definition: PlayerQuest.cpp:2340
void AdditionalSavingAddMask(uint8 mask)
Definition: Player.h:2550

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::Explored, FindQuestSlot(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_STATUS_FAILED, SendQuestComplete(), and QuestStatusData::Status.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), Spell::EffectQuestComplete(), SmartAI::EndPath(), go_ahune_ice_stone::GossipSelect(), GroupEventHappens(), WorldSession::HandleAreaTriggerOpcode(), go_table_theka::OnGossipHello(), npc_parqual_fintallas::OnGossipSelect(), npc_great_bear_spirit::OnGossipSelect(), npc_thrall_warchief::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_stone_watcher_of_norgannon::OnGossipSelect(), npc_vekjik::OnGossipSelect(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), npc_doctor::npc_doctorAI::PatientSaved(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), and npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI().

◆ AutoStoreLoot() [1/2]

void Player::AutoStoreLoot ( uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
inline
1305{ AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition: Player.cpp:13436

References AutoStoreLoot(), NULL_BAG, and NULL_SLOT.

Referenced by AutoStoreLoot().

◆ AutoStoreLoot() [2/2]

void Player::AutoStoreLoot ( uint8  bag,
uint8  slot,
uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
13437{
13438 Loot loot;
13439 loot.FillLoot (loot_id, store, this, true);
13440
13441 uint32 max_slot = loot.GetMaxSlotInLootFor(this);
13442 for (uint32 i = 0; i < max_slot; ++i)
13443 {
13444 LootItem* lootItem = loot.LootItemInSlot(i, this);
13445
13446 ItemPosCountVec dest;
13447 InventoryResult msg = CanStoreNewItem(bag, slot, dest, lootItem->itemid, lootItem->count);
13448 if (msg != EQUIP_ERR_OK && slot != NULL_SLOT)
13449 msg = CanStoreNewItem(bag, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13450 if (msg != EQUIP_ERR_OK && bag != NULL_BAG)
13451 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13452 if (msg != EQUIP_ERR_OK)
13453 {
13454 SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
13455 continue;
13456 }
13457
13458 Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
13459 SendNewItem(pItem, lootItem->count, false, false, broadcast);
13460 }
13461}
Definition: LootMgr.h:155
uint32 itemid
Definition: LootMgr.h:156
int32 randomPropertyId
Definition: LootMgr.h:159
uint8 count
Definition: LootMgr.h:163
Definition: LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition: LootMgr.cpp:907
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition: LootMgr.cpp:842
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:564

References CanStoreNewItem(), LootItem::count, EQUIP_ERR_OK, Loot::FillLoot(), Loot::GetMaxSlotInLootFor(), LootItem::itemid, Loot::LootItemInSlot(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by Group::CountTheRoll(), Spell::EffectCreateItem2(), Spell::EffectCreateRandomItem(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ AutoUnequipOffhandIfNeed()

void Player::AutoUnequipOffhandIfNeed ( bool  force = false)
12416{
12418 if (!offItem)
12419 {
12421 return;
12422 }
12423
12424 // unequip offhand weapon if player doesn't have dual wield anymore
12426 force = true;
12427
12428 // need unequip offhand for 2h-weapon without TitanGrip (in any from hands)
12429 if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed())))
12430 {
12432 return;
12433 }
12434
12435 ItemPosCountVec off_dest;
12436 uint8 off_msg = CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false);
12437 if (off_msg == EQUIP_ERR_OK)
12438 {
12440 StoreItem(off_dest, offItem, true);
12441 }
12442 else
12443 {
12445 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
12446 offItem->DeleteFromInventoryDB(trans); // deletes item from character's inventory
12447 offItem->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
12448
12449 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
12450 MailDraft(subject, "There were problems with equipping one or several items").AddItem(offItem).SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
12451
12452 CharacterDatabase.CommitTransaction(trans);
12453 }
12455}
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
uint32 InventoryType
Definition: ItemTemplate.h:632
bool CanTitanGrip() const
Definition: Player.h:2163
bool IsTwoHandUsed() const
Definition: Player.h:1354
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:2993
void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap=false)
Definition: PlayerStorage.cpp:2914
void UpdateTitansGrip()
Definition: PlayerUpdates.cpp:1794
bool CanDualWield() const
Definition: Unit.h:685
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition: Mail.cpp:186
MailDraft & AddItem(Item *item)
Definition: Mail.cpp:94

References MailDraft::AddItem(), Unit::CanDualWield(), CanStoreItem(), CanTitanGrip(), CharacterDatabase, Item::DeleteFromInventoryDB(), EQUIP_ERR_OK, EQUIPMENT_SLOT_OFFHAND, WorldSession::GetAcoreString(), GetItemByPos(), GetSession(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, IsTwoHandUsed(), LANG_NOT_EQUIPPED_ITEM, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MoveItemFromInventory(), NULL_BAG, NULL_SLOT, RemoveItem(), Item::SaveToDB(), MailDraft::SendMailTo(), StoreItem(), and UpdateTitansGrip().

Referenced by _StoreOrEquipNewItem(), ActivateSpec(), Spell::EffectSummonChangeItem(), FindEquipSlot(), WorldSession::HandleAutoEquipItemOpcode(), resetTalents(), SplitItem(), StoreNewItemInBestSlots(), SwapItem(), and UpdateZone().

◆ BankItem() [1/2]

Item * Player::BankItem ( ItemPosCountVec const &  dest,
Item pItem,
bool  update 
)
inline

◆ BankItem() [2/2]

Item * Player::BankItem ( uint16  pos,
Item pItem,
bool  update 
)

◆ BindToInstance()

void Player::BindToInstance ( )
6523{
6524 InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId);
6525 if (!mapSave) //it seems sometimes mapSave is nullptr, but I did not check why
6526 return;
6527
6529 data << uint32(0);
6530 GetSession()->SendPacket(&data);
6531 sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this);
6532}
#define sInstanceSaveMgr
Definition: InstanceSaveMgr.h:202
@ SMSG_INSTANCE_SAVE_CREATED
Definition: Opcodes.h:745
uint32 _pendingBindId
Definition: Player.h:2950
Definition: InstanceSaveMgr.h:56

References _pendingBindId, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_INSTANCE_SAVE_CREATED.

Referenced by WorldSession::HandleInstanceLockResponse(), and Update().

◆ BuildCreateUpdateBlockForPlayer()

void Player::BuildCreateUpdateBlockForPlayer ( UpdateData data,
Player target 
)
overridevirtual

Reimplemented from Object.

3797{
3798 if (target == this)
3799 {
3800 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3801 {
3802 if (!m_items[i])
3803 continue;
3804
3805 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3806 }
3807
3809 {
3810 if (!m_items[i])
3811 continue;
3812
3813 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3814 }
3816 {
3817 if (!m_items[i])
3818 continue;
3819
3820 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3821 }
3822 }
3823
3825}
@ KEYRING_SLOT_START
Definition: Player.h:730
@ BANK_SLOT_BAG_END
Definition: Player.h:718
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:189

References BANK_SLOT_BAG_END, Object::BuildCreateUpdateBlockForPlayer(), CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

Referenced by Map::SendInitSelf().

◆ BuildEnchantmentsInfoData()

void Player::BuildEnchantmentsInfoData ( WorldPacket data)
14381{
14382 uint32 slotUsedMask = 0;
14383 std::size_t slotUsedMaskPos = data->wpos();
14384 *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
14385
14386 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14387 {
14389
14390 if (!item)
14391 continue;
14392
14393 slotUsedMask |= (1 << i);
14394
14395 *data << uint32(item->GetEntry()); // item entry
14396
14397 uint16 enchantmentMask = 0;
14398 std::size_t enchantmentMaskPos = data->wpos();
14399 *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
14400
14401 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
14402 {
14403 uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
14404
14405 if (!enchId)
14406 continue;
14407
14408 enchantmentMask |= (1 << j);
14409
14410 *data << uint16(enchId); // enchantmentId?
14411 }
14412
14413 data->put<uint16>(enchantmentMaskPos, enchantmentMask);
14414
14415 *data << int16(item->GetItemRandomPropertyId()); // item random property id
14416 *data << item->GetGuidValue(ITEM_FIELD_CREATOR).WriteAsPacked(); // item creator
14417 *data << uint32(item->GetItemSuffixFactor()); // item suffix factor
14418 }
14419
14420 data->put<uint32>(slotUsedMaskPos, slotUsedMask);
14421}
@ ITEM_FIELD_CREATOR
Definition: UpdateFields.h:37
ObjectGuid GetGuidValue(uint16 index) const
Definition: Object.cpp:337
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316
std::size_t wpos() const
Definition: ByteBuffer.h:330
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References EQUIPMENT_SLOT_END, Item::GetEnchantmentId(), Object::GetEntry(), Object::GetGuidValue(), GetItemByPos(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), INVENTORY_SLOT_BAG_0, ITEM_FIELD_CREATOR, MAX_ENCHANTMENT_SLOT, ByteBuffer::put(), ByteBuffer::wpos(), and ObjectGuid::WriteAsPacked().

Referenced by WorldSession::HandleInspectOpcode().

◆ BuildEnumData()

bool Player::BuildEnumData ( PreparedQueryResult  result,
WorldPacket data 
)
static
1086{
1087 // 0 1 2 3 4 5 6 7
1088 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle,
1089 // 8 9 10 11 12 13 14 15
1090 // characters.hairColor, characters.facialStyle, character.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z,
1091 // 16 17 18 19 20 21 22 23
1092 // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid,
1093 // 24 25
1094 // characters.extra_flags, character_declinedname.genitive
1095
1096 Field* fields = result->Fetch();
1097
1098 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1099 uint8 plrRace = fields[2].Get<uint8>();
1100 uint8 plrClass = fields[3].Get<uint8>();
1101 uint8 gender = fields[4].Get<uint8>();
1102
1103 ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
1104
1105 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(plrRace, plrClass);
1106 if (!info)
1107 {
1108 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Don't build enum.", guid.ToString());
1109 return false;
1110 }
1111 else if (!IsValidGender(gender))
1112 {
1113 LOG_ERROR("entities.player", "Player ({}) has incorrect gender ({}), don't build enum.", guid.ToString(), gender);
1114 return false;
1115 }
1116
1117 *data << guid;
1118 *data << fields[1].Get<std::string>(); // name
1119 *data << uint8(plrRace); // race
1120 *data << uint8(plrClass); // class
1121 *data << uint8(gender); // gender
1122
1123 uint8 skin = fields[5].Get<uint8>();
1124 uint8 face = fields[6].Get<uint8>();
1125 uint8 hairStyle = fields[7].Get<uint8>();
1126 uint8 hairColor = fields[8].Get<uint8>();
1127 uint8 facialStyle = fields[9].Get<uint8>();
1128
1129 uint32 charFlags = 0;
1130 uint32 playerFlags = fields[17].Get<uint32>();
1131 uint16 atLoginFlags = fields[18].Get<uint16>();
1132 uint32 zone = (atLoginFlags & AT_LOGIN_FIRST) != 0 ? 0 : fields[11].Get<uint16>(); // if first login do not show the zone
1133
1134 *data << uint8(skin);
1135 *data << uint8(face);
1136 *data << uint8(hairStyle);
1137 *data << uint8(hairColor);
1138 *data << uint8(facialStyle);
1139
1140 *data << uint8(fields[10].Get<uint8>()); // level
1141 *data << uint32(zone); // zone
1142 *data << uint32(fields[12].Get<uint16>()); // map
1143
1144 *data << fields[13].Get<float>(); // x
1145 *data << fields[14].Get<float>(); // y
1146 *data << fields[15].Get<float>(); // z
1147
1148 *data << uint32(fields[16].Get<uint32>()); // guild id
1149
1150 if (atLoginFlags & AT_LOGIN_RESURRECT)
1151 playerFlags &= ~PLAYER_FLAGS_GHOST;
1152 if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
1153 charFlags |= CHARACTER_FLAG_HIDE_HELM;
1154 if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
1155 charFlags |= CHARACTER_FLAG_HIDE_CLOAK;
1156 if (playerFlags & PLAYER_FLAGS_GHOST)
1157 charFlags |= CHARACTER_FLAG_GHOST;
1158 if (atLoginFlags & AT_LOGIN_RENAME)
1159 charFlags |= CHARACTER_FLAG_RENAME;
1160 if (fields[23].Get<uint32>())
1162 if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
1163 {
1164 if (!fields[25].Get<std::string>().empty())
1165 charFlags |= CHARACTER_FLAG_DECLINED;
1166 }
1167 else
1168 charFlags |= CHARACTER_FLAG_DECLINED;
1169
1170 *data << uint32(charFlags); // character flags
1171
1172 // character customize flags
1173 if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
1175 else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION)
1177 else if (atLoginFlags & AT_LOGIN_CHANGE_RACE)
1179 else
1181
1182 // First login
1183 *data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);
1184
1185 // Pets info
1186 uint32 petDisplayId = 0;
1187 uint32 petLevel = 0;
1188 uint32 petFamily = 0;
1189
1190 // show pet at selection character in character list only for non-ghost character
1191 if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || (plrClass == CLASS_DEATH_KNIGHT && (fields[21].Get<uint32>()&PLAYER_EXTRA_SHOW_DK_PET))))
1192 {
1193 uint32 entry = fields[19].Get<uint32>();
1194 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry);
1195 if (creatureInfo)
1196 {
1197 petDisplayId = fields[20].Get<uint32>();
1198 petLevel = fields[21].Get<uint16>();
1199 petFamily = creatureInfo->family;
1200 }
1201 }
1202
1203 *data << uint32(petDisplayId);
1204 *data << uint32(petLevel);
1205 *data << uint32(petFamily);
1206
1207 std::vector<std::string_view> equipment = Acore::Tokenize(fields[22].Get<std::string_view>(), ' ', false);
1208 for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
1209 {
1210 uint32 const visualBase = slot * 2;
1211 Optional<uint32> itemId;
1212
1213 if (visualBase < equipment.size())
1214 {
1215 itemId = Acore::StringTo<uint32>(equipment[visualBase]);
1216 }
1217
1218 ItemTemplate const* proto = nullptr;
1219 if (itemId)
1220 {
1221 proto = sObjectMgr->GetItemTemplate(*itemId);
1222 }
1223
1224 if (!proto)
1225 {
1226 if (!itemId || *itemId)
1227 {
1228 LOG_WARN("entities.player.loading", "Player {} has invalid equipment '{}' in `equipmentcache` at index {}. Skipped.",
1229 guid.ToString(), (visualBase < equipment.size()) ? equipment[visualBase] : "<none>", visualBase);
1230 }
1231
1232 *data << uint32(0);
1233 *data << uint8(0);
1234 *data << uint32(0);
1235
1236 continue;
1237 }
1238
1239 SpellItemEnchantmentEntry const* enchant = nullptr;
1240
1241 Optional<uint32> enchants = {};
1242 if ((visualBase + 1) < equipment.size())
1243 {
1244 enchants = Acore::StringTo<uint32>(equipment[visualBase + 1]);
1245 }
1246
1247 if (!enchants)
1248 {
1249 LOG_WARN("entities.player.loading", "Player {} has invalid enchantment info '{}' in `equipmentcache` at index {}. Skipped.",
1250 guid.ToString(), ((visualBase + 1) < equipment.size()) ? equipment[visualBase + 1] : "<none>", visualBase + 1);
1251
1252 enchants = 0;
1253 }
1254
1255 for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
1256 {
1257 // values stored in 2 uint16
1258 uint32 enchantId = 0x0000FFFF & ((*enchants) >> enchantSlot * 16);
1259 if (!enchantId)
1260 {
1261 continue;
1262 }
1263
1264 enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
1265 if (enchant)
1266 {
1267 break;
1268 }
1269 }
1270
1271 *data << uint32(proto->DisplayInfoID);
1272 *data << uint8(proto->InventoryType);
1273 *data << uint32(enchant ? enchant->aura_id : 0);
1274 }
1275
1276 return true;
1277}
@ CHAR_CUSTOMIZE_FLAG_RACE
Definition: Player.cpp:135
@ CHAR_CUSTOMIZE_FLAG_NONE
Definition: Player.cpp:132
@ CHAR_CUSTOMIZE_FLAG_FACTION
Definition: Player.cpp:134
@ CHAR_CUSTOMIZE_FLAG_CUSTOMIZE
Definition: Player.cpp:133
@ CHARACTER_FLAG_GHOST
Definition: Player.cpp:109
@ CHARACTER_FLAG_DECLINED
Definition: Player.cpp:121
@ CHARACTER_FLAG_HIDE_HELM
Definition: Player.cpp:106
@ CHARACTER_FLAG_HIDE_CLOAK
Definition: Player.cpp:107
@ CHARACTER_FLAG_LOCKED_BY_BILLING
Definition: Player.cpp:120
@ CHARACTER_FLAG_RENAME
Definition: Player.cpp:110
@ PLAYER_EXTRA_SHOW_DK_PET
Definition: Player.h:593
@ PLAYER_FLAGS_HIDE_CLOAK
Definition: Player.h:485
@ PLAYER_FLAGS_GHOST
Definition: Player.h:478
@ PLAYER_FLAGS_HIDE_HELM
Definition: Player.h:484
@ AT_LOGIN_FIRST
Definition: Player.h:605
@ AT_LOGIN_RESURRECT
Definition: Player.h:611
@ AT_LOGIN_CUSTOMIZE
Definition: Player.h:603
@ AT_LOGIN_RENAME
Definition: Player.h:600
@ AT_LOGIN_CHANGE_RACE
Definition: Player.h:607
@ AT_LOGIN_CHANGE_FACTION
Definition: Player.h:606
@ CONFIG_DECLINED_NAMES_USED
Definition: IWorld.h:113
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
Definition: CreatureData.h:189
uint32 DisplayInfoID
Definition: ItemTemplate.h:625
static bool IsValidGender(uint8 Gender)
Definition: Player.h:1560
uint32 aura_id
Definition: DBCStructure.h:1850

References AT_LOGIN_CHANGE_FACTION, AT_LOGIN_CHANGE_RACE, AT_LOGIN_CUSTOMIZE, AT_LOGIN_FIRST, AT_LOGIN_RENAME, AT_LOGIN_RESURRECT, SpellItemEnchantmentEntry::aura_id, CHAR_CUSTOMIZE_FLAG_CUSTOMIZE, CHAR_CUSTOMIZE_FLAG_FACTION, CHAR_CUSTOMIZE_FLAG_NONE, CHAR_CUSTOMIZE_FLAG_RACE, CHARACTER_FLAG_DECLINED, CHARACTER_FLAG_GHOST, CHARACTER_FLAG_HIDE_CLOAK, CHARACTER_FLAG_HIDE_HELM, CHARACTER_FLAG_LOCKED_BY_BILLING, CHARACTER_FLAG_RENAME, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_WARLOCK, CONFIG_DECLINED_NAMES_USED, ItemTemplate::DisplayInfoID, Field::Get(), INVENTORY_SLOT_BAG_END, ItemTemplate::InventoryType, IsValidGender(), LOG_ERROR, LOG_WARN, PERM_ENCHANTMENT_SLOT, PLAYER_EXTRA_SHOW_DK_PET, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, sObjectMgr, sSpellItemEnchantmentStore, sWorld, TEMP_ENCHANTMENT_SLOT, and Acore::Tokenize().

Referenced by WorldSession::HandleCharEnum().

◆ BuildPetTalentsInfoData()

void Player::BuildPetTalentsInfoData ( WorldPacket data)
14298{
14299 uint32 unspentTalentPoints = 0;
14300 std::size_t pointsPos = data->wpos();
14301 *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
14302
14303 uint8 talentIdCount = 0;
14304 std::size_t countPos = data->wpos();
14305 *data << uint8(talentIdCount); // [PH], talentIdCount
14306
14307 Pet* pet = GetPet();
14308 if (!pet)
14309 return;
14310
14311 unspentTalentPoints = pet->GetFreeTalentPoints();
14312
14313 data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
14314
14315 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14316 if (!ci)
14317 return;
14318
14319 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14320 if (!pet_family || pet_family->petTalentType < 0)
14321 return;
14322
14323 for (uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
14324 {
14325 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentTabId);
14326 if (!talentTabInfo)
14327 continue;
14328
14329 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14330 continue;
14331
14332 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
14333 {
14334 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14335 if (!talentInfo)
14336 continue;
14337
14338 // skip another tab talents
14339 if (talentInfo->TalentTab != talentTabId)
14340 continue;
14341
14342 // find max talent rank (0~4)
14343 int8 curtalent_maxrank = -1;
14344 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14345 {
14346 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14347 {
14348 curtalent_maxrank = rank;
14349 break;
14350 }
14351 }
14352
14353 // not learned talent
14354 if (curtalent_maxrank < 0)
14355 continue;
14356
14357 *data << uint32(talentInfo->TalentID); // Talent.dbc
14358 *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
14359
14360 ++talentIdCount;
14361 }
14362
14363 data->put<uint8>(countPos, talentIdCount); // put real count
14364
14365 break;
14366 }
14367}
DBCStorage< TalentTabEntry > sTalentTabStore(TalentTabEntryfmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
#define MAX_TALENT_RANK
Definition: DBCStructure.h:1918
std::int8_t int8
Definition: Define.h:105
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:206
uint8 GetFreeTalentPoints()
Definition: Pet.h:131
bool HasSpell(uint32 spell) const override
Definition: Pet.cpp:2340
Definition: DBCStructure.h:754
int32 petTalentType
Definition: DBCStructure.h:762
uint32 TalentTab
Definition: DBCStructure.h:1925
Definition: DBCStructure.h:1940
uint32 petTalentMask
Definition: DBCStructure.h:1947

References Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), GetPet(), Pet::HasSpell(), MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, ByteBuffer::put(), TalentEntry::RankID, sCreatureFamilyStore, sTalentStore, sTalentTabStore, TalentEntry::TalentID, TalentEntry::TalentTab, and ByteBuffer::wpos().

Referenced by SendTalentsInfoData().

◆ BuildPlayerRepop()

void Player::BuildPlayerRepop ( )
4367{
4369 data << GetPackGUID();
4370 GetSession()->SendPacket(&data);
4371 if (getRace(true) == RACE_NIGHTELF)
4372 {
4373 CastSpell(this, 20584, true);
4374 }
4375 CastSpell(this, 8326, true);
4376
4377 // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
4378 // there must be SMSG.STOP_MIRROR_TIMER
4379
4380 // the player cannot have a corpse already on current map, only bones which are not returned by GetCorpse
4381 WorldLocation corpseLocation = GetCorpseLocation();
4382 if (GetCorpse() && corpseLocation.GetMapId() == GetMapId())
4383 {
4384 LOG_ERROR("entities.player", "BuildPlayerRepop: player {} ({}) already has a corpse", GetName(), GetGUID().ToString());
4385 return;
4386 }
4387
4388 // create a corpse and place it at the player's location
4389 Corpse* corpse = CreateCorpse();
4390 if (!corpse)
4391 {
4392 LOG_ERROR("entities.player", "Error creating corpse for Player {} [{}]", GetName(), GetGUID().ToString());
4393 return;
4394 }
4395 GetMap()->AddToMap(corpse);
4396 SetHealth(1); // convert player body to ghost
4398 SetWaterWalking(true);
4399 if (!GetSession()->isLogingOut())
4400 {
4402 }
4403 RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
4404 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4405 if (corpseReclaimDelay >= 0)
4406 {
4407 SendCorpseReclaimDelay(corpseReclaimDelay);
4408 }
4409 corpse->ResetGhostTime(); // to prevent cheating
4410 StopMirrorTimers(); // disable timers on bars
4412 sScriptMgr->OnPlayerReleasedGhost(this);
4413}
@ UNIT_FIELD_BYTES_1
Definition: UpdateFields.h:131
@ MOVE_UNROOT
Definition: Player.h:457
@ MOVE_WATER_WALK
Definition: Player.h:458
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition: UnitDefines.h:59
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:255
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ SMSG_PRE_RESURRECT
Definition: Opcodes.h:1202
Definition: Corpse.h:49
void ResetGhostTime()
Definition: Corpse.cpp:195
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
PackedGuid const & GetPackGUID() const
Definition: Object.h:111
Map * GetMap() const
Definition: Object.h:529
void SendCorpseReclaimDelay(uint32 delay)
Definition: Player.cpp:12924
void StopMirrorTimers()
Definition: Player.h:2031
WorldLocation GetCorpseLocation() const
Definition: Player.h:2015
Corpse * GetCorpse() const
Definition: Player.cpp:4648
bool SetWaterWalking(bool apply, bool packetOnly=false) override
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition: Player.cpp:15912
int32 CalculateCorpseReclaimDelay(bool load=false)
Definition: Player.cpp:12883
Corpse * CreateCorpse()
Definition: Player.cpp:4533
void SetMovement(PlayerMovementType pType)
Definition: Player.cpp:4336
void SetHealth(uint32 val)
Definition: Unit.cpp:15405
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:827
bool AddToMap(T *, bool checkTransport=false)
Definition: Map.cpp:555

References Map::AddToMap(), CalculateCorpseReclaimDelay(), Unit::CastSpell(), CreateCorpse(), GetCorpse(), GetCorpseLocation(), Object::GetGUID(), WorldObject::GetMap(), WorldLocation::GetMapId(), WorldObject::GetName(), Object::GetPackGUID(), Unit::getRace(), GetSession(), LOG_ERROR, MOVE_UNROOT, MOVE_WATER_WALK, RACE_NIGHTELF, Unit::RemoveUnitFlag(), Corpse::ResetGhostTime(), SendCorpseReclaimDelay(), WorldSession::SendPacket(), Object::SetByteValue(), Unit::SetHealth(), SetMovement(), SetWaterWalking(), SMSG_PRE_RESURRECT, sScriptMgr, StopMirrorTimers(), Position::ToString(), UNIT_BYTE1_FLAG_ALWAYS_STAND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, and UNIT_FLAG_SKINNABLE.

Referenced by Spell::EffectStuck(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), RemovedInsignia(), and Update().

◆ BuildPlayerTalentsInfoData()

void Player::BuildPlayerTalentsInfoData ( WorldPacket data)
14264{
14265 *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
14266 *data << uint8(m_specsCount); // talent group count (0, 1 or 2)
14267 *data << uint8(m_activeSpec); // talent group index (0 or 1)
14268
14271
14272 for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx)
14273 {
14274 uint8 talentIdCount = 0;
14275 std::size_t pos = data->wpos();
14276 *data << uint8(talentIdCount); // [PH], talentIdCount
14277
14278 const PlayerTalentMap& talentMap = GetTalentMap();
14279 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14280 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14281 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard
14282 {
14283 *data << uint32(talentPos->talent_id); // Talent.dbc
14284 *data << uint8(talentPos->rank); // talentMaxRank (0-4)
14285 ++talentIdCount;
14286 }
14287
14288 data->put<uint8>(pos, talentIdCount); // put real count
14289
14290 *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
14291
14292 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14293 *data << uint16(m_Glyphs[specIdx][i]); // GlyphProperties.dbc
14294 }
14295}
std::unordered_map< uint32, PlayerTalent * > PlayerTalentMap
Definition: Player.h:192
uint32 GetFreeTalentPoints() const
Definition: Player.h:1697
const PlayerTalentMap & GetTalentMap() const
Definition: Player.h:2586

References GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), m_activeSpec, m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, MAX_TALENT_SPECS, PLAYERSPELL_REMOVED, ByteBuffer::put(), and ByteBuffer::wpos().

Referenced by WorldSession::HandleInspectOpcode(), and SendTalentsInfoData().

◆ BuyItemFromVendorSlot()

bool Player::BuyItemFromVendorSlot ( ObjectGuid  vendorguid,
uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot 
)
10665{
10666 sScriptMgr->OnBeforeBuyItemFromVendor(this, vendorguid, vendorslot, item, count, bag, slot);
10667
10668 // this check can be used from the hook to implement a custom vendor process
10669 if (item == 0)
10670 return true;
10671
10672 // cheating attempt
10673 if (count < 1) count = 1;
10674
10675 // cheating attempt
10676 if (slot > MAX_BAG_SIZE && slot != NULL_SLOT)
10677 return false;
10678
10679 if (!IsAlive())
10680 return false;
10681
10682 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
10683 if (!pProto)
10684 {
10685 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10686 return false;
10687 }
10688
10689 if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())
10690 {
10691 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10692 return false;
10693 }
10694
10696 {
10697 return false;
10698 }
10699
10700 Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
10701 if (!creature)
10702 {
10703 LOG_DEBUG("network", "WORLD: BuyItemFromVendor - Unit ({}) not found or you can't interact with him.", vendorguid.ToString());
10704 SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0);
10705 return false;
10706 }
10707
10708 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), item);
10709 if (!sConditionMgr->IsObjectMeetToConditions(this, creature, conditions))
10710 {
10711 //LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry {} item {}", creature->GetEntry(), item);
10712 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10713 return false;
10714 }
10715
10716 VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems();
10717 if (!vItems || vItems->Empty())
10718 {
10719 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10720 return false;
10721 }
10722
10723 if (vendorslot >= vItems->GetItemCount())
10724 {
10725 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10726 return false;
10727 }
10728
10729 VendorItem const* crItem = vItems->GetItem(vendorslot);
10730 // store diff item (cheating)
10731 if (!crItem || crItem->item != item)
10732 {
10733 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10734 return false;
10735 }
10736
10737 // check current item amount if it limited
10738 if (crItem->maxcount != 0)
10739 {
10740 if (creature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count)
10741 {
10742 SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, creature, item, 0);
10743 return false;
10744 }
10745 }
10746
10748 {
10749 SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
10750 return false;
10751 }
10752
10753 if (crItem->ExtendedCost)
10754 {
10755 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10756 if (!iece)
10757 {
10758 LOG_ERROR("entities.player", "Item {} have wrong ExtendedCost field value {}", pProto->ItemId, crItem->ExtendedCost);
10759 return false;
10760 }
10761
10762 // honor points price
10763 if (GetHonorPoints() < (iece->reqhonorpoints * count))
10764 {
10766 return false;
10767 }
10768
10769 // arena points price
10770 if (GetArenaPoints() < (iece->reqarenapoints * count))
10771 {
10773 return false;
10774 }
10775
10776 // item base price
10777 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10778 {
10779 if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
10780 {
10782 return false;
10783 }
10784 }
10785
10786 // check for personal arena rating requirement
10788 {
10789 // probably not the proper equip err
10790 SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr);
10791 return false;
10792 }
10793 }
10794
10795 uint32 price = 0;
10796 if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32)
10797 {
10798 uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice;
10799 if ((uint32)count > maxCount)
10800 {
10801 LOG_ERROR("entities.player", "Player {} tried to buy {} item id {}, causing overflow", GetName(), (uint32)count, pProto->ItemId);
10802 count = (uint8)maxCount;
10803 }
10804 price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT
10805
10806 // reputation discount
10807 price = uint32(floor(price * GetReputationPriceDiscount(creature)));
10808
10809 if (!HasEnoughMoney(price))
10810 {
10811 SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0);
10812 return false;
10813 }
10814 }
10815
10816 if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
10817 {
10818 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, true))
10819 return false;
10820 }
10821 else if (IsEquipmentPos(bag, slot))
10822 {
10823 if (pProto->BuyCount * count != 1)
10824 {
10826 return false;
10827 }
10828 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false))
10829 return false;
10830 }
10831 else
10832 {
10834 return false;
10835 }
10836
10837 return crItem->maxcount != 0;
10838}
@ EQUIP_ERR_CANT_EQUIP_RANK
Definition: Item.h:110
@ EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
Definition: Item.h:67
@ EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS
Definition: Item.h:116
@ EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT
Definition: Item.h:50
@ EQUIP_ERR_VENDOR_MISSING_TURNINS
Definition: Item.h:115
@ EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS
Definition: Item.h:117
@ BUY_ERR_CANT_FIND_ITEM
Definition: Item.h:141
@ BUY_ERR_DISTANCE_TOO_FAR
Definition: Item.h:145
@ BUY_ERR_NOT_ENOUGHT_MONEY
Definition: Item.h:143
@ BUY_ERR_REPUTATION_REQUIRE
Definition: Item.h:149
@ BUY_ERR_ITEM_ALREADY_SOLD
Definition: Item.h:142
@ ITEM_FLAG2_FACTION_HORDE
Definition: ItemTemplate.h:183
@ ITEM_FLAG2_FACTION_ALLIANCE
Definition: ItemTemplate.h:184
#define MAX_BAG_SIZE
Definition: Bag.h:22
#define MAX_MONEY_AMOUNT
Definition: Player.h:929
@ UNIT_NPC_FLAG_VENDOR
Definition: UnitDefines.h:301
#define sConditionMgr
Definition: ConditionMgr.h:289
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:236
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
Definition: Creature.h:46
VendorItemData const * GetVendorItems() const
Definition: Creature.cpp:3041
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
Definition: Creature.cpp:3046
Definition: CreatureData.h:457
uint32 ExtendedCost
Definition: CreatureData.h:464
bool IsGoldRequired(ItemTemplate const *pProto) const
Definition: CreatureData.h:467
uint32 item
Definition: CreatureData.h:461
uint32 maxcount
Definition: CreatureData.h:462
Definition: CreatureData.h:472
VendorItem * GetItem(uint32 slot) const
Definition: CreatureData.h:475
bool Empty() const
Definition: CreatureData.h:482
uint8 GetItemCount() const
Definition: CreatureData.h:483
uint32 BuyCount
Definition: ItemTemplate.h:629
uint32 AllowableClass
Definition: ItemTemplate.h:633
int32 BuyPrice
Definition: ItemTemplate.h:630
bool HasFlag2(ItemFlags2 flag) const
Definition: ItemTemplate.h:828
uint32 RequiredReputationRank
Definition: ItemTemplate.h:643
uint32 RequiredReputationFaction
Definition: ItemTemplate.h:642
uint32 ItemId
Definition: ItemTemplate.h:620
bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
Definition: Player.cpp:10598
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition: PlayerStorage.cpp:678
bool HasEnoughMoney(uint32 amount) const
Definition: Player.h:1594
Creature * GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask)
Definition: Player.cpp:2074
bool IsGameMaster() const
Definition: Player.h:1157
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5818
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param)
Definition: PlayerStorage.cpp:4079
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
If trans is specified, arena point save query will be added to trans.
Definition: Player.cpp:10840
uint32 GetCurrentVendor() const
Definition: WorldSession.h:366
uint32 reqarenaslot
Definition: DBCStructure.h:1189
uint32 reqpersonalarenarating
Definition: DBCStructure.h:1192

References _StoreOrEquipNewItem(), ItemTemplate::AllowableClass, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, BUY_ERR_CANT_FIND_ITEM, BUY_ERR_DISTANCE_TOO_FAR, BUY_ERR_ITEM_ALREADY_SOLD, BUY_ERR_NOT_ENOUGHT_MONEY, BUY_ERR_REPUTATION_REQUIRE, ItemTemplate::BuyCount, ItemTemplate::BuyPrice, VendorItemData::Empty(), EQUIP_ERR_CANT_EQUIP_RANK, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, EQUIP_ERR_VENDOR_MISSING_TURNINS, VendorItem::ExtendedCost, GetArenaPoints(), Unit::getClassMask(), WorldSession::GetCurrentVendor(), Object::GetEntry(), GetHonorPoints(), VendorItemData::GetItem(), VendorItemData::GetItemCount(), GetMaxPersonalArenaRatingRequirement(), WorldObject::GetName(), GetNPCIfCanInteractWith(), GetReputationPriceDiscount(), GetReputationRank(), GetSession(), GetTeamId(), Creature::GetVendorItemCurrentCount(), Creature::GetVendorItems(), HasEnoughMoney(), ItemTemplate::HasFlag2(), HasItemCount(), Unit::IsAlive(), IsEquipmentPos(), IsGameMaster(), VendorItem::IsGoldRequired(), IsInventoryPos(), VendorItem::item, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, MAX_BAG_SIZE, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, MAX_MONEY_AMOUNT, VendorItem::maxcount, NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqarenaslot, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, ItemExtendedCostEntry::reqpersonalarenarating, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, sConditionMgr, SendBuyError(), SendEquipError(), sItemExtendedCostStore, sObjectMgr, sScriptMgr, TEAM_ALLIANCE, TEAM_HORDE, ObjectGuid::ToString(), and UNIT_NPC_FLAG_VENDOR.

Referenced by WorldSession::HandleBuyItemInSlotOpcode(), and WorldSession::HandleBuyItemOpcode().

◆ CalcRage()

void Player::CalcRage ( uint32  damage,
bool  attacker 
)

◆ CalculateCorpseReclaimDelay()

int32 Player::CalculateCorpseReclaimDelay ( bool  load = false)
12884{
12885 Corpse* corpse = GetCorpse();
12886
12887 if (load && !corpse)
12888 return -1;
12889
12890 bool pvp = corpse ? corpse->GetType() == CORPSE_RESURRECTABLE_PVP : m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH;
12891
12892 uint32 delay;
12893
12894 if (load)
12895 {
12896 if (corpse->GetGhostTime() > m_deathExpireTime)
12897 return -1;
12898
12899 uint64 count = 0;
12900
12901 if ((pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP)) ||
12902 (!pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
12903 {
12904 count = (m_deathExpireTime - corpse->GetGhostTime()) / DEATH_EXPIRE_STEP;
12905
12906 if (count >= MAX_DEATH_COUNT)
12907 count = MAX_DEATH_COUNT - 1;
12908 }
12909
12910 time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count];
12911 time_t now = GameTime::GetGameTime().count();
12912
12913 if (now >= expected_time)
12914 return -1;
12915
12916 delay = expected_time - now;
12917 }
12918 else
12919 delay = GetCorpseReclaimDelay(pvp);
12920
12921 return delay * IN_MILLISECONDS;
12922}
@ CORPSE_RESURRECTABLE_PVP
Definition: Corpse.h:30
static uint32 copseReclaimDelay[MAX_DEATH_COUNT]
Definition: Player.cpp:138
@ PLAYER_EXTRA_PVP_DEATH
Definition: Player.h:592
#define DEATH_EXPIRE_STEP
Definition: Player.h:75
#define MAX_DEATH_COUNT
Definition: Player.h:76
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition: IWorld.h:108
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition: IWorld.h:109
time_t const & GetGhostTime() const
Definition: Corpse.h:70
CorpseType GetType() const
Definition: Corpse.h:72
uint32 GetCorpseReclaimDelay(bool pvp) const
Definition: Player.cpp:12866

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, CORPSE_RESURRECTABLE_PVP, DEATH_EXPIRE_STEP, GetCorpse(), GetCorpseReclaimDelay(), GameTime::GetGameTime(), Corpse::GetGhostTime(), Corpse::GetType(), IN_MILLISECONDS, m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ CalculateMinMaxDamage()

void Player::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex 
)
overridevirtual

Implements Unit.

528{
529 // Only proto damage, not affected by any mods
530 if (damageIndex != 0)
531 {
532 minDamage = 0.0f;
533 maxDamage = 0.0f;
534
535 if (!IsInFeralForm() && CanUseAttackType(attType))
536 {
537 minDamage = GetWeaponDamageRange(attType, MINDAMAGE, damageIndex);
538 maxDamage = GetWeaponDamageRange(attType, MAXDAMAGE, damageIndex);
539 }
540
541 return;
542 }
543
544 UnitMods unitMod;
545
546 switch (attType)
547 {
548 case BASE_ATTACK:
549 default:
550 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
551 break;
552 case OFF_ATTACK:
553 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
554 break;
555 case RANGED_ATTACK:
556 unitMod = UNIT_MOD_DAMAGE_RANGED;
557 break;
558 }
559
560 float attackSpeedMod = GetAPMultiplier(attType, normalized);
561
562 float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * attackSpeedMod;
563 float basePct = GetModifierValue(unitMod, BASE_PCT);
564 float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
565 float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
566
567 float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
568 float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
569
570 if (IsInFeralForm()) // check if player is druid and in cat or bear forms
571 {
572 uint8 lvl = GetLevel();
573 if (lvl > 60)
574 lvl = 60;
575
576 weaponMinDamage = lvl * 0.85f * attackSpeedMod;
577 weaponMaxDamage = lvl * 1.25f * attackSpeedMod;
578 }
579 else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
580 {
581 // cannot use ranged/off attack, set values to 0
582 if (attType != BASE_ATTACK)
583 {
584 minDamage = 0.0f;
585 maxDamage = 0.0f;
586 return;
587 }
588 weaponMinDamage = BASE_MINDAMAGE;
589 weaponMaxDamage = BASE_MAXDAMAGE;
590 }
591 else if (attType == RANGED_ATTACK) // add ammo DPS to ranged damage
592 {
593 weaponMinDamage += GetAmmoDPS() * attackSpeedMod;
594 weaponMaxDamage += GetAmmoDPS() * attackSpeedMod;
595 }
596
597 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
598 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
599
600 // pussywizard: crashfix (casting negative to uint => min > max => assertion in urand)
601 if (minDamage < 0.0f || minDamage > 1000000000.0f)
602 minDamage = 0.0f;
603 if (maxDamage < 0.0f || maxDamage > 1000000000.0f)
604 maxDamage = 0.0f;
605 if (minDamage > maxDamage)
606 minDamage = maxDamage;
607}
@ BASE_PCT
Definition: Unit.h:127
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15355
float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const
Definition: Unit.cpp:15215
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17146

References BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, Unit::CanUseAttackType(), GetAmmoDPS(), Unit::GetAPMultiplier(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetTotalAttackPowerValue(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

◆ CalculateQuestRewardXP()

uint32 Player::CalculateQuestRewardXP ( Quest const *  quest)
1397{
1398 // apply world quest rate
1399 uint32 xp = uint32(quest->XPValue(GetLevel()) * GetQuestRate(quest->IsDFQuest()));
1400
1401 // handle SPELL_AURA_MOD_XP_QUEST_PCT auras
1403 for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
1404 AddPct(xp, (*i)->GetAmount());
1405
1406 return xp;
1407}
@ SPELL_AURA_MOD_XP_QUEST_PCT
Definition: SpellAuraDefines.h:354
T AddPct(T &base, U pct)
Definition: Util.h:67
float GetQuestRate(bool isDFQuest=false)
Definition: Player.cpp:16196

References AddPct(), Unit::GetAuraEffectsByType(), Unit::GetLevel(), GetQuestRate(), Quest::IsDFQuest(), SPELL_AURA_MOD_XP_QUEST_PCT, and Quest::XPValue().

Referenced by RewardQuest(), PlayerMenu::SendQuestGiverOfferReward(), and PlayerMenu::SendQuestGiverQuestDetails().

◆ CalculateReputationGain()

float Player::CalculateReputationGain ( ReputationSource  source,
uint32  creatureOrQuestLevel,
float  rep,
int32  faction,
bool  noQuestBonus = false 
)
5826{
5827 float percent = 100.0f;
5828
5829 float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
5830
5831 // faction specific auras only seem to apply to kills
5832 if (source == REPUTATION_SOURCE_KILL)
5834
5835 percent += rep > 0.f ? repMod : -repMod;
5836
5837 float rate;
5838 switch (source)
5839 {
5841 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL);
5842 break;
5848 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
5849 break;
5851 default:
5852 rate = 1.0f;
5853 break;
5854 }
5855
5856 if (rate != 1.0f && creatureOrQuestLevel <= Acore::XP::GetGrayLevel(GetLevel()))
5857 percent *= rate;
5858
5859 if (percent <= 0.0f)
5860 return 0;
5861
5862 // Multiply result with the faction specific rate
5863 if (RepRewardRate const* repData = sObjectMgr->GetRepRewardRate(faction))
5864 {
5865 float repRate = 0.0f;
5866 switch (source)
5867 {
5869 repRate = repData->creatureRate;
5870 break;
5872 repRate = repData->questRate;
5873 break;
5875 repRate = repData->questDailyRate;
5876 break;
5878 repRate = repData->questWeeklyRate;
5879 break;
5881 repRate = repData->questMonthlyRate;
5882 break;
5884 repRate = repData->questRepeatableRate;
5885 break;
5887 repRate = repData->spellRate;
5888 break;
5889 }
5890
5891 // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
5892 if (repRate <= 0.0f)
5893 return 0;
5894
5895 percent *= repRate;
5896 }
5897
5898 if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false))
5899 percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS);
5900
5901 return CalculatePct(rep, percent);
5902}
@ SPELL_AURA_MOD_REPUTATION_GAIN
Definition: SpellAuraDefines.h:219
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
Definition: SpellAuraDefines.h:253
@ REPUTATION_SOURCE_KILL
Definition: Player.h:239
@ REPUTATION_SOURCE_SPELL
Definition: Player.h:245
@ REPUTATION_SOURCE_QUEST
Definition: Player.h:240
@ REPUTATION_SOURCE_MONTHLY_QUEST
Definition: Player.h:243
@ REPUTATION_SOURCE_REPEATABLE_QUEST
Definition: Player.h:244
@ REPUTATION_SOURCE_WEEKLY_QUEST
Definition: Player.h:242
@ REPUTATION_SOURCE_DAILY_QUEST
Definition: Player.h:241
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition: IWorld.h:484
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition: IWorld.h:483
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition: IWorld.h:485
uint8 GetGrayLevel(uint8 pl_level)
Definition: Formulas.h:46
bool GetsRecruitAFriendBonus(bool forXP)
Definition: Player.cpp:12635
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5965
Definition: ObjectMgr.h:557

References CalculatePct(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_KILL, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_SPELL, REPUTATION_SOURCE_WEEKLY_QUEST, sObjectMgr, SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, SPELL_AURA_MOD_REPUTATION_GAIN, and sWorld.

Referenced by Spell::EffectReputation(), and RewardReputation().

◆ CalculateTalentsPoints()

uint32 Player::CalculateTalentsPoints ( ) const
13567{
13568 uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
13569
13570 uint32 talentPointsForLevel = 0;
13572 {
13573 talentPointsForLevel = base_talent;
13574 }
13575 else
13576 {
13577 talentPointsForLevel = GetLevel() < 56 ? 0 : GetLevel() - 55;
13578 talentPointsForLevel += m_questRewardTalentCount;
13579
13580 if (talentPointsForLevel > base_talent)
13581 {
13582 talentPointsForLevel = base_talent;
13583 }
13584 }
13585
13586 talentPointsForLevel += m_extraBonusTalentCount;
13587 sScriptMgr->OnCalculateTalentsPoints(this, talentPointsForLevel);
13588 return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
13589}
@ CLASS_CONTEXT_TALENT_POINT_CALC
Definition: UnitDefines.h:212
@ RATE_TALENT
Definition: IWorld.h:511

References CLASS_CONTEXT_TALENT_POINT_CALC, CLASS_DEATH_KNIGHT, Unit::GetLevel(), WorldLocation::GetMapId(), IsClass(), m_extraBonusTalentCount, m_questRewardTalentCount, RATE_TALENT, sScriptMgr, and sWorld.

Referenced by InitTalentForLevel(), and resetTalents().

◆ CanAddQuest()

bool Player::CanAddQuest ( Quest const *  quest,
bool  msg 
)
265{
266 if (!SatisfyQuestLog(msg))
267 return false;
268
269 uint32 srcitem = quest->GetSrcItemId();
270 if (srcitem > 0)
271 {
272 uint32 count = quest->GetSrcItemCount();
273 ItemPosCountVec dest;
274 InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
275
276 // player already have max number (in most case 1) source item, no additional item needed and quest can be added.
278 return true;
279 else if (msg2 != EQUIP_ERR_OK)
280 {
281 SendEquipError(msg2, nullptr, nullptr, srcitem);
282 return false;
283 }
284 }
285 return true;
286}
@ EQUIP_ERR_CANT_CARRY_MORE_OF_THIS
Definition: Item.h:64
bool SatisfyQuestLog(bool msg)
Definition: PlayerQuest.cpp:978

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SatisfyQuestLog(), and SendEquipError().

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ CanAlwaysSee()

bool Player::CanAlwaysSee ( WorldObject const *  obj) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11405{
11406 // Always can see self
11407 if (m_mover == obj)
11408 return true;
11409
11411 if (obj->GetGUID() == guid)
11412 return true;
11413
11414 return false;
11415}
@ PLAYER_FARSIGHT
Definition: UpdateFields.h:334

References Object::GetGUID(), Object::GetGuidValue(), m_mover, and PLAYER_FARSIGHT.

◆ CanBankItem()

InventoryResult Player::CanBankItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
2048{
2049 if (!pItem)
2051
2052 uint32 count = pItem->GetCount();
2053
2054 LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, pItem->GetEntry(), pItem->GetCount());
2055 ItemTemplate const* pProto = pItem->GetTemplate();
2056 if (!pProto)
2058
2059 // Xinef: Removed next loot generated check
2060 if (pItem->GetGUID() == GetLootGUID())
2062
2063 if (pItem->IsBindedNotWith(this))
2065
2066 // Currency tokens are not supposed to be swapped out of their hidden bag
2067 uint8 pItemslot = pItem->GetSlot();
2068 if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END)
2069 {
2070 LOG_ERROR("entities.player", "Possible hacking attempt: Player {} [{}] tried to move token [{}, entry: {}] out of the currency bag!",
2071 GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId);
2073 }
2074
2075 // check count of items (skip for auto move for same player from bank)
2077 if (res != EQUIP_ERR_OK)
2078 return res;
2079
2080 // in specific slot
2081 if (bag != NULL_BAG && slot != NULL_SLOT)
2082 {
2083 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
2084 {
2085 if (!pItem->IsBag())
2087
2090
2091 res = CanUseItem(pItem, not_loading);
2092 if (res != EQUIP_ERR_OK)
2093 return res;
2094 }
2095
2096 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
2097 if (res != EQUIP_ERR_OK)
2098 return res;
2099
2100 if (count == 0)
2101 return EQUIP_ERR_OK;
2102 }
2103
2104 // not specific slot or have space for partly store only in specific slot
2105
2106 // in specific bag
2107 if (bag != NULL_BAG)
2108 {
2109 if (pItem->IsNotEmptyBag())
2111
2112 // search stack in bag for merge to
2113 if (pProto->Stackable != 1)
2114 {
2115 if (bag == INVENTORY_SLOT_BAG_0)
2116 {
2117 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2118 if (res != EQUIP_ERR_OK)
2119 return res;
2120
2121 if (count == 0)
2122 return EQUIP_ERR_OK;
2123 }
2124 else
2125 {
2126 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
2127 if (res != EQUIP_ERR_OK)
2128 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
2129
2130 if (res != EQUIP_ERR_OK)
2131 return res;
2132
2133 if (count == 0)
2134 return EQUIP_ERR_OK;
2135 }
2136 }
2137
2138 // search free slot in bag
2139 if (bag == INVENTORY_SLOT_BAG_0)
2140 {
2141 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2142 if (res != EQUIP_ERR_OK)
2143 return res;
2144
2145 if (count == 0)
2146 return EQUIP_ERR_OK;
2147 }
2148 else
2149 {
2150 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
2151 if (res != EQUIP_ERR_OK)
2152 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
2153
2154 if (res != EQUIP_ERR_OK)
2155 return res;
2156
2157 if (count == 0)
2158 return EQUIP_ERR_OK;
2159 }
2160 }
2161
2162 // not specific bag or have space for partly store only in specific bag
2163
2164 // search stack for merge to
2165 if (pProto->Stackable != 1)
2166 {
2167 // in slots
2168 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2169 if (res != EQUIP_ERR_OK)
2170 return res;
2171
2172 if (count == 0)
2173 return EQUIP_ERR_OK;
2174
2175 // in special bags
2176 if (pProto->BagFamily)
2177 {
2178 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2179 {
2180 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
2181 if (res != EQUIP_ERR_OK)
2182 continue;
2183
2184 if (count == 0)
2185 return EQUIP_ERR_OK;
2186 }
2187 }
2188
2189 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2190 {
2191 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
2192 if (res != EQUIP_ERR_OK)
2193 continue;
2194
2195 if (count == 0)
2196 return EQUIP_ERR_OK;
2197 }
2198 }
2199
2200 // search free place in special bag
2201 if (pProto->BagFamily)
2202 {
2203 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2204 {
2205 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
2206 if (res != EQUIP_ERR_OK)
2207 continue;
2208
2209 if (count == 0)
2210 return EQUIP_ERR_OK;
2211 }
2212 }
2213
2214 // search free space
2215 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2216 if (res != EQUIP_ERR_OK)
2217 return res;
2218
2219 if (count == 0)
2220 return EQUIP_ERR_OK;
2221
2222 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2223 {
2224 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
2225 if (res != EQUIP_ERR_OK)
2226 continue;
2227
2228 if (count == 0)
2229 return EQUIP_ERR_OK;
2230 }
2231 return EQUIP_ERR_BANK_FULL;
2232}
@ EQUIP_ERR_ALREADY_LOOTED
Definition: Item.h:96
@ EQUIP_ERR_DONT_OWN_THAT_ITEM
Definition: Item.h:79
@ EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT
Definition: Item.h:81
@ EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG
Definition: Item.h:52
@ EQUIP_ERR_BANK_FULL
Definition: Item.h:98
@ EQUIP_ERR_ITEM_NOT_FOUND
Definition: Item.h:70
@ EQUIP_ERR_ITEMS_CANT_BE_SWAPPED
Definition: Item.h:68
@ BANK_SLOT_BAG_START
Definition: Player.h:717
@ BANK_SLOT_ITEM_START
Definition: Player.h:711
@ BANK_SLOT_ITEM_END
Definition: Player.h:712
bool IsBindedNotWith(Player const *player) const
Definition: Item.cpp:1133
bool IsBag() const
Definition: Item.h:254
bool IsNotEmptyBag() const
Definition: Item.cpp:312
uint32 BagFamily
Definition: ItemTemplate.h:679
int32 Stackable
Definition: ItemTemplate.h:645
uint8 GetBankBagSlotCount() const
Definition: Player.h:1262
ObjectGuid GetLootGUID() const
Definition: Player.h:1969
InventoryResult CanTakeMoreSimilarItems(Item *pItem) const
Definition: Player.h:1269
InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition: PlayerStorage.cpp:1073
InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition: PlayerStorage.cpp:1003
InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
Definition: PlayerStorage.cpp:932
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
Definition: PlayerStorage.cpp:2234

References ItemTemplate::BagFamily, BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CanUseItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_BANK_FULL, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, GetBankBagSlotCount(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetLootGUID(), WorldObject::GetName(), Item::GetSlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, Item::IsBag(), Item::IsBindedNotWith(), Item::IsNotEmptyBag(), ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, NULL_BAG, NULL_SLOT, ItemTemplate::Stackable, ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), SplitItem(), and SwapItem().

◆ CanBlock()

bool Player::CanBlock ( ) const
inline
2161{ return m_canBlock; }

References m_canBlock.

Referenced by UpdateBlockPercentage().

◆ CanCaptureTowerPoint()

bool Player::CanCaptureTowerPoint ( ) const
13189{
13190 return (!HasStealthAura() && // not stealthed
13191 !HasInvisibilityAura() && // not invisible
13192 IsAlive() // live player
13193 );
13194}
bool HasStealthAura() const
Definition: Unit.h:1050
bool HasInvisibilityAura() const
Definition: Unit.h:1051

References Unit::HasInvisibilityAura(), Unit::HasStealthAura(), and Unit::IsAlive().

◆ CanCompleteQuest()

bool Player::CanCompleteQuest ( uint32  quest_id,
const QuestStatusData q_savedStatus = nullptr 
)
289{
290 if (quest_id)
291 {
292 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
293 if (!qInfo)
294 return false;
295
296 // Xinef: take seasonals into account
297 if(!qInfo->IsRepeatable() && !qInfo->IsSeasonal() && IsQuestRewarded(quest_id))
298 return false; // not allow re-complete quest
299
300 // auto complete quest
301 if ((qInfo->IsAutoComplete() || !qInfo->GetQuestMethod()) && CanTakeQuest(qInfo, false))
302 return true;
303
304 QuestStatusData q_status;
305 if (q_savedStatus)
306 q_status = *q_savedStatus;
307 else
308 {
309 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
310 if (itr == m_QuestStatus.end())
311 return false;
312
313 q_status = itr->second;
314 }
315
316 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
317 {
319 {
320 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
321 {
322 if (qInfo->RequiredItemCount[i] != 0 && q_status.ItemCount[i] < qInfo->RequiredItemCount[i])
323 return false;
324 }
325 }
326
328 {
329 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
330 {
331 if (qInfo->RequiredNpcOrGo[i] == 0)
332 continue;
333
334 if (qInfo->RequiredNpcOrGoCount[i] != 0 && q_status.CreatureOrGOCount[i] < qInfo->RequiredNpcOrGoCount[i])
335 return false;
336 }
337 }
338
340 if (qInfo->GetPlayersSlain() != 0 && q_status.PlayerCount < qInfo->GetPlayersSlain())
341 return false;
342
344 return false;
345
346 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0)
347 return false;
348
349 if (qInfo->GetRewOrReqMoney() < 0)
350 {
351 if (!HasEnoughMoney(-qInfo->GetRewOrReqMoney()))
352 return false;
353 }
354
355 uint32 repFacId = qInfo->GetRepObjectiveFaction();
356 if (repFacId && GetReputationMgr().GetReputation(repFacId) < qInfo->GetRepObjectiveValue())
357 return false;
358
359 return true;
360 }
361 }
362 return false;
363}
@ QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT
Definition: QuestDef.h:161
bool CanTakeQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:251
uint32 GetReputation(uint32 factionentry) const
Definition: Player.cpp:15288
bool IsQuestRewarded(uint32 quest_id) const
Definition: Player.h:1614
bool HasSpecialFlag(uint32 flag) const
Definition: QuestDef.h:223
int32 GetRepObjectiveValue() const
Definition: QuestDef.h:239
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:303
uint32 GetRepObjectiveFaction() const
Definition: QuestDef.h:238
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:304
bool IsRepeatable() const
Definition: QuestDef.h:282
bool IsAutoComplete() const
Definition: QuestDef.cpp:274
uint32 GetPlayersSlain() const
Definition: QuestDef.h:253
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:300
int32 GetRewOrReqMoney(uint8 playerLevel=0) const
Definition: QuestDef.cpp:238
bool IsSeasonal() const
Definition: QuestDef.h:289
uint32 GetQuestMethod() const
Definition: QuestDef.h:228

References CanTakeQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Quest::GetPlayersSlain(), Quest::GetQuestMethod(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveValue(), GetReputation(), GetReputationMgr(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QuestStatusData::ItemCount, m_QuestStatus, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, QuestStatusData::Status, and QuestStatusData::Timer.

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), and TalkedToCreature().

◆ CanCompleteRepeatableQuest()

bool Player::CanCompleteRepeatableQuest ( Quest const *  quest)
366{
367 // Solve problem that player don't have the quest and try complete it.
368 // if repeatable she must be able to complete event if player don't have it.
369 // Seem that all repeatable quest are DELIVER Flag so, no need to add more.
370 if (!CanTakeQuest(quest, false))
371 return false;
372
373 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
374 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
375 if (quest->RequiredItemId[i] && quest->RequiredItemCount[i] && !HasItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i]))
376 return false;
377
378 if (!CanRewardQuest(quest, false))
379 return false;
380
381 return true;
382}
bool CanRewardQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:384

References CanRewardQuest(), CanTakeQuest(), HasItemCount(), Quest::HasSpecialFlag(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverCompleteQuest(), and SendPreparedQuest().

◆ CanEnterWater()

bool Player::CanEnterWater ( ) const
inlineoverridevirtual

Implements Unit.

2546{ return true; }

◆ CanEquipItem()

InventoryResult Player::CanEquipItem ( uint8  slot,
uint16 dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
1829{
1830 dest = 0;
1831 if (pItem)
1832 {
1833 LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = {}, item = {}, count = {}", slot, pItem->GetEntry(), pItem->GetCount());
1834 ItemTemplate const* pProto = pItem->GetTemplate();
1835 if (pProto)
1836 {
1837 if (!sScriptMgr->CanEquipItem(const_cast<Player*>(this), slot, dest, pItem, swap, not_loading))
1839
1840 // item used
1841 if (pItem->m_lootGenerated)
1843
1844 if (pItem->IsBindedNotWith(this))
1846
1847 // check count of items (skip for auto move for same player from bank)
1849 if (res != EQUIP_ERR_OK)
1850 return res;
1851
1852 // check this only in game
1853 if (not_loading)
1854 {
1855 // May be here should be more stronger checks; STUNNED checked
1856 // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
1859
1860 // do not allow equipping gear except weapons, offhands, projectiles, relics in
1861 // - combat
1862 // - in-progress arenas
1863 if (!pProto->CanChangeEquipStateInCombat())
1864 {
1865 if (IsInCombat())
1867
1868 if (Battleground* bg = GetBattleground())
1869 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
1871 }
1872
1873 if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0)
1874 return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
1875
1876 if (IsNonMeleeSpellCast(false))
1878 }
1879
1881 // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items)
1882 if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < GetLevel())
1884
1885 uint8 eslot = FindEquipSlot(pProto, slot, swap);
1886 if (eslot == NULL_SLOT)
1888
1889 // Xinef: dont allow to equip items on disarmed slot
1890 if (!CanUseAttackType(GetAttackBySlot(eslot)))
1892
1893 res = CanUseItem(pItem, not_loading);
1894 if (res != EQUIP_ERR_OK)
1895 return res;
1896
1897 if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot))
1899
1900 // if we are swapping 2 equipped items, CanEquipUniqueItem check
1901 // should ignore the item we are trying to swap, and not the
1902 // destination item. CanEquipUniqueItem should ignore destination
1903 // item only when we are swapping weapon from bag
1904 uint8 ignore = uint8(NULL_SLOT);
1905 switch (eslot)
1906 {
1908 ignore = EQUIPMENT_SLOT_OFFHAND;
1909 break;
1911 ignore = EQUIPMENT_SLOT_MAINHAND;
1912 break;
1914 ignore = EQUIPMENT_SLOT_FINGER2;
1915 break;
1917 ignore = EQUIPMENT_SLOT_FINGER1;
1918 break;
1920 ignore = EQUIPMENT_SLOT_TRINKET2;
1921 break;
1923 ignore = EQUIPMENT_SLOT_TRINKET1;
1924 break;
1925 }
1926
1927 if (ignore == uint8(NULL_SLOT) || pItem != GetItemByPos(INVENTORY_SLOT_BAG_0, ignore))
1928 ignore = eslot;
1929
1930 InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? ignore : uint8(NULL_SLOT));
1931 if (res2 != EQUIP_ERR_OK)
1932 return res2;
1933
1934 // check unique-equipped special item classes
1935 if (pProto->Class == ITEM_CLASS_QUIVER)
1937 if (Item* pBag = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
1938 if (pBag != pItem)
1939 if (ItemTemplate const* pBagProto = pBag->GetTemplate())
1940 if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot))
1941 return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
1944
1945 uint32 type = pProto->InventoryType;
1946
1947 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1948 {
1949 // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1950 // xinef: same for fishing poles
1953
1954 else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1955 {
1956 if (!CanDualWield())
1958 }
1959 else if (type == INVTYPE_2HWEAPON)
1960 {
1961 if (!CanDualWield() || !CanTitanGrip())
1963 }
1964
1965 if (IsTwoHandUsed())
1967 }
1968
1969 // equip two-hand weapon case (with possible unequip 2 items)
1970 if (type == INVTYPE_2HWEAPON)
1971 {
1972 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1973 {
1974 if (!CanTitanGrip())
1976 }
1977 else if (eslot != EQUIPMENT_SLOT_MAINHAND)
1979
1980 if (!CanTitanGrip())
1981 {
1982 // offhand item must can be stored in inventory for offhand item and it also must be unequipped
1984 ItemPosCountVec off_dest;
1985 if (offItem && (!not_loading ||
1987 CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK))
1989 }
1990 }
1991 dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
1992 return EQUIP_ERR_OK;
1993 }
1994 }
1995
1997}
@ STATUS_IN_PROGRESS
Definition: Battleground.h:197
@ EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH
Definition: Item.h:89
@ EQUIP_ERR_CANT_DUAL_WIELD
Definition: Item.h:61
@ EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE
Definition: Item.h:56
@ EQUIP_ERR_NOT_DURING_ARENA_MATCH
Definition: Item.h:124
@ EQUIP_ERR_NOT_IN_COMBAT
Definition: Item.h:107
@ EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED
Definition: Item.h:60
@ EQUIP_ERR_NOT_WHILE_DISARMED
Definition: Item.h:108
@ EQUIP_ERR_CANT_DO_RIGHT_NOW
Definition: Item.h:86
@ EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER
Definition: Item.h:80
@ EQUIP_ERR_YOU_ARE_STUNNED
Definition: Item.h:84
@ EQUIP_ERR_INVENTORY_FULL
Definition: Item.h:97
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
Definition: ItemTemplate.h:364
@ ITEM_SUBCLASS_WEAPON_POLEARM
Definition: ItemTemplate.h:350
@ INVTYPE_RELIC
Definition: ItemTemplate.h:284
@ ITEM_SUBCLASS_AMMO_POUCH
Definition: ItemTemplate.h:481
@ ITEM_CLASS_QUIVER
Definition: ItemTemplate.h:302
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:293
@ EQUIPMENT_SLOT_FINGER1
Definition: Player.h:685
@ EQUIPMENT_SLOT_FINGER2
Definition: Player.h:686
@ EQUIPMENT_SLOT_TRINKET1
Definition: Player.h:687
@ EQUIPMENT_SLOT_TRINKET2
Definition: Player.h:688
#define DEFAULT_MAX_LEVEL
Definition: DBCEnums.h:35
Definition: Battleground.h:298
bool m_lootGenerated
Definition: Item.h:321
bool CanChangeEquipStateInCombat() const
Definition: ItemTemplate.h:707
uint32 ScalingStatDistribution
Definition: ItemTemplate.h:649
uint32 SubClass
Definition: ItemTemplate.h:622
Definition: Player.h:1063
InventoryResult CanUnequipItem(uint16 src, bool swap) const
Definition: PlayerStorage.cpp:1999
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
Definition: Player.cpp:13732
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12148
uint8 FindEquipSlot(ItemTemplate const *proto, uint32 slot, bool swap) const
Definition: PlayerStorage.cpp:131

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanDualWield(), CanEquipUniqueItem(), CanStoreItem(), CanTakeMoreSimilarItems(), CanTitanGrip(), CanUnequipItem(), Unit::CanUseAttackType(), CanUseItem(), ItemTemplate::Class, DEFAULT_MAX_LEVEL, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_DUAL_WIELD, EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_STUNNED, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, FindEquipSlot(), GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Unit::GetLevel(), Item::GetTemplate(), Unit::HasUnitState(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_RELIC, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, Item::IsBindedNotWith(), Unit::IsInCombat(), Unit::IsNonMeleeSpellCast(), IsTwoHandUsed(), ITEM_CLASS_QUIVER, ITEM_CLASS_WEAPON, ITEM_SUBCLASS_AMMO_POUCH, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, LOG_DEBUG, Item::m_lootGenerated, m_weaponChangeTimer, ScalingStatDistributionEntry::MaxLevel, NULL_BAG, NULL_SLOT, ItemTemplate::ScalingStatDistribution, sScalingStatDistributionStore, sScriptMgr, STATUS_IN_PROGRESS, ItemTemplate::SubClass, and UNIT_STATE_STUNNED.

Referenced by _LoadInventory(), CanEquipNewItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleEquipmentSetUse(), SplitItem(), and SwapItem().

◆ CanEquipNewItem()

InventoryResult Player::CanEquipNewItem ( uint8  slot,
uint16 dest,
uint32  item,
bool  swap 
) const
1815{
1816 dest = 0;
1817 Item* pItem = Item::CreateItem(item, 1, this);
1818 if (pItem)
1819 {
1820 InventoryResult result = CanEquipItem(slot, dest, pItem, swap);
1821 delete pItem;
1822 return result;
1823 }
1824
1826}
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1088

References CanEquipItem(), Item::CreateItem(), and EQUIP_ERR_ITEM_NOT_FOUND.

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ CanEquipUniqueItem() [1/2]

InventoryResult Player::CanEquipUniqueItem ( Item pItem,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13733{
13734 ItemTemplate const* pProto = pItem->GetTemplate();
13735
13736 // proto based limitations
13737 if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count))
13738 return res;
13739
13740 // check unique-equipped on gems
13741 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
13742 {
13743 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
13744 if (!enchant_id)
13745 continue;
13746 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
13747 if (!enchantEntry)
13748 continue;
13749
13750 ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->GemID);
13751 if (!pGem)
13752 continue;
13753
13754 // include for check equip another gems with same limit category for not equipped item (and then not counted)
13755 uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
13757
13758 if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count))
13759 return res;
13760 }
13761
13762 return EQUIP_ERR_OK;
13763}
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
Definition: Item.cpp:1034
uint32 ItemLimitCategory
Definition: ItemTemplate.h:687
uint32 GemID
Definition: DBCStructure.h:1852

References CanEquipUniqueItem(), EQUIP_ERR_OK, SpellItemEnchantmentEntry::GemID, Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), Item::GetTemplate(), Item::IsEquipped(), ItemTemplate::ItemLimitCategory, sObjectMgr, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by CanEquipItem(), CanEquipUniqueItem(), CanRollOnItem(), and WorldSession::HandleSocketOpcode().

◆ CanEquipUniqueItem() [2/2]

InventoryResult Player::CanEquipUniqueItem ( ItemTemplate const *  itemProto,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13766{
13767 // check unique-equipped on item
13768 if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE))
13769 {
13770 // there is an equip limit on this item
13771 if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot))
13773 }
13774
13775 // check unique-equipped limit
13776 if (itemProto->ItemLimitCategory)
13777 {
13778 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
13779 if (!limitEntry)
13781
13782 // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case
13783
13784 if (limit_count > limitEntry->maxCount)
13786
13787 // there is an equip limit on this item
13788 if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot))
13790 }
13791
13792 return EQUIP_ERR_OK;
13793}
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED
Definition: Item.h:135
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE
Definition: Item.h:114
@ EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED
Definition: Item.h:121
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
Definition: ItemTemplate.h:166
bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:751
bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:789
Definition: DBCStructure.h:1196
uint32 maxCount
Definition: DBCStructure.h:1200

References EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE, EQUIP_ERR_OK, ItemTemplate::HasFlag(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), ITEM_FLAG_UNIQUE_EQUIPPABLE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemLimitCategoryEntry::maxCount, and sItemLimitCategoryStore.

◆ CanFly()

bool Player::CanFly ( ) const
inlineoverridevirtual

Implements Unit.

@ MOVEMENTFLAG_CAN_FLY
Definition: UnitDefines.h:368
bool HasMovementFlag(uint32 flag) const
Definition: Object.h:332
MovementInfo m_movementInfo
Definition: Object.h:607

References MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, and MOVEMENTFLAG_CAN_FLY.

◆ canFlyInZone()

bool Player::canFlyInZone ( uint32  mapid,
uint32  zone,
SpellInfo const *  bySpell 
)
13592{
13593 if (!sScriptMgr->OnCanPlayerFlyInZone(this, mapid,zone,bySpell))
13594 {
13595 return false;
13596 }
13597
13598 // continent checked in SpellInfo::CheckLocation at cast and area update
13599 uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
13600 if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
13601 {
13602 if (!HasSpell(54197)) // 54197 = Cold Weather Flying
13603 {
13604 return false;
13605 }
13606 }
13607
13608 return true;
13609}
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
Definition: DBCStores.cpp:703
@ SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT
Definition: SharedDefines.h:663

References GetVirtualMapForMapAndZone(), SpellInfo::HasAttribute(), HasSpell(), SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT, and sScriptMgr.

Referenced by SpellInfo::CheckLocation().

◆ CanInteractWithQuestGiver()

bool Player::CanInteractWithQuestGiver ( Object questGiver)
2057{
2058 switch (questGiver->GetTypeId())
2059 {
2060 case TYPEID_UNIT:
2061 return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr;
2062 case TYPEID_GAMEOBJECT:
2063 return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr;
2064 case TYPEID_PLAYER:
2065 return IsAlive() && questGiver->ToPlayer()->IsAlive();
2066 case TYPEID_ITEM:
2067 return IsAlive();
2068 default:
2069 break;
2070 }
2071 return false;
2072}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:295
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition: SharedDefines.h:1562
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const
Definition: Player.cpp:2131

References GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectIfCanInteractWith(), Object::GetGUID(), GetNPCIfCanInteractWith(), Object::GetTypeId(), Unit::IsAlive(), Object::ToPlayer(), TYPEID_GAMEOBJECT, TYPEID_ITEM, TYPEID_PLAYER, TYPEID_UNIT, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), and WorldSession::HandleQuestgiverRequestRewardOpcode().

◆ CanJoinConstantChannelInZone()

bool Player::CanJoinConstantChannelInZone ( ChatChannelsEntry const *  channel,
AreaTableEntry const *  zone 
)
4918{
4919 // Player can join LFG anywhere
4920 if (channel->flags & CHANNEL_DBC_FLAG_LFG && sWorld->getBoolConfig(CONFIG_LFG_LOCATION_ALL))
4921 return true;
4922
4923 if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE)
4924 return false;
4925
4926 if ((channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY) && (!(zone->flags & AREA_FLAG_SLAVE_CAPITAL)))
4927 return false;
4928
4929 if ((channel->flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId())
4930 return false;
4931
4932 return true;
4933}
@ CHANNEL_DBC_FLAG_CITY_ONLY
Definition: Channel.h:101
@ CHANNEL_DBC_FLAG_GUILD_REQ
Definition: Channel.h:104
@ CHANNEL_DBC_FLAG_ZONE_DEP
Definition: Channel.h:98
@ CHANNEL_DBC_FLAG_LFG
Definition: Channel.h:105
@ CONFIG_LFG_LOCATION_ALL
Definition: IWorld.h:162
@ AREA_FLAG_ARENA_INSTANCE
Definition: DBCEnums.h:250
@ AREA_FLAG_SLAVE_CAPITAL
Definition: DBCEnums.h:237
uint32 GetGuildId() const
Definition: Player.h:1877

References AREA_FLAG_ARENA_INSTANCE, AREA_FLAG_SLAVE_CAPITAL, CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GUILD_REQ, CHANNEL_DBC_FLAG_LFG, CHANNEL_DBC_FLAG_ZONE_DEP, CONFIG_LFG_LOCATION_ALL, AreaTableEntry::flags, ChatChannelsEntry::flags, GetGuildId(), and sWorld.

Referenced by UpdateLocalChannels().

◆ CanJoinToBattleground()

bool Player::CanJoinToBattleground ( ) const
11312{
11313 // check Deserter debuff
11314 if (HasAura(26013))
11315 return false;
11316
11317 return true;
11318}
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5649

References Unit::HasAura().

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattleFieldPortOpcode(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ CanKnockback()

bool Player::CanKnockback ( )
inline
2475{ return m_canKnockback; }

References m_canKnockback.

◆ CanNoReagentCast()

bool Player::CanNoReagentCast ( SpellInfo const *  spellInfo) const
12508{
12509 // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
12511 return true;
12512
12513 // Check no reagent use mask
12514 flag96 noReagentMask;
12515 noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
12516 noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 1);
12517 noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 2);
12518 if (spellInfo->SpellFamilyFlags & noReagentMask)
12519 return true;
12520
12521 return false;
12522}
@ PLAYER_NO_REAGENT_COST_1
Definition: UpdateFields.h:387
@ UNIT_FLAG_PREPARATION
Definition: UnitDefines.h:234
@ SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
Definition: SharedDefines.h:568

References Object::GetUInt32Value(), SpellInfo::HasAttribute(), Unit::HasUnitFlag(), PLAYER_NO_REAGENT_COST_1, SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA, SpellInfo::SpellFamilyFlags, and UNIT_FLAG_PREPARATION.

Referenced by Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), and Spell::TakeReagents().

◆ CanParry()

bool Player::CanParry ( ) const
inline

◆ CanPetResurrect()

bool Player::CanPetResurrect ( )
9119{
9120 PetStable* const petStable = GetPetStable();
9121 if (!petStable)
9122 {
9123 // No pets
9124 return false;
9125 }
9126
9127 auto const& currectPet = petStable->CurrentPet;
9128 auto const& unslottedHunterPet = petStable->GetUnslottedHunterPet();
9129
9130 if (!currectPet && !unslottedHunterPet)
9131 {
9132 // No pets
9133 return false;
9134 }
9135
9136 // Check current pet
9137 if (currectPet && !currectPet->Health)
9138 {
9139 return true;
9140 }
9141
9142 // Check dismiss/unslotted hunter pet
9143 if (unslottedHunterPet && !unslottedHunterPet->Health)
9144 {
9145 return true;
9146 }
9147
9148 return false;
9149}
Definition: PetDefines.h:202
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:230
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:225
PetStable * GetPetStable()
Definition: Player.h:1201

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

◆ CanReportAfkDueToLimit()

bool Player::CanReportAfkDueToLimit ( )
11321{
11322 // a player can complain about 15 people per 5 minutes
11323 if (m_bgData.bgAfkReportedCount++ >= 15)
11324 return false;
11325
11326 return true;
11327}
uint8 bgAfkReportedCount
Definition: Player.h:1042
BGData m_bgData
Definition: Player.h:2642

References BGData::bgAfkReportedCount, and m_bgData.

Referenced by ReportedAfkBy().

◆ CanResummonPet()

bool Player::CanResummonPet ( uint32  spellid)
14203{
14205 {
14206 if (CanSeeDKPet())
14207 return true;
14208 else if (spellid == 52150) // Raise Dead
14209 return false;
14210 }
14211
14213 {
14214 if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
14215 return true;
14216 }
14217
14219 {
14220 return true;
14221 }
14222
14223 return HasSpell(spellid);
14224}
@ CLASS_CONTEXT_PET
Definition: UnitDefines.h:215
bool CanSeeDKPet() const
Definition: Player.h:2572

References CanSeeDKPet(), CLASS_CONTEXT_PET, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_MAGE, Unit::HasAura(), HasSpell(), and IsClass().

Referenced by spell_gen_pet_summoned::HandleScript(), and ResummonPetTemporaryUnSummonedIfAny().

◆ CanRewardQuest() [1/2]

bool Player::CanRewardQuest ( Quest const *  quest,
bool  msg 
)
385{
386 // not auto complete quest and not completed quest (only cheating case, then ignore without message)
387 if (!quest->IsDFQuest() && !quest->IsAutoComplete() && quest->GetQuestMethod() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
388 return false;
389
390 // daily quest can't be rewarded (25 daily quest already completed)
391 if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestMonth(quest, true) || !SatisfyQuestSeasonal(quest, true))
392 return false;
393
394 // rewarded and not repeatable quest (only cheating case, then ignore without message)
395 if (GetQuestRewardStatus(quest->GetQuestId()))
396 return false;
397
398 // prevent receive reward with quest items in bank
399 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
400 {
401 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
402 {
403 if (quest->RequiredItemCount[i] != 0 &&
404 GetItemCount(quest->RequiredItemId[i]) < quest->RequiredItemCount[i])
405 {
406 if (msg)
407 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr, quest->RequiredItemId[i]);
408 return false;
409 }
410 }
411 }
412
413 // prevent receive reward with low money and GetRewOrReqMoney() < 0
414 if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-quest->GetRewOrReqMoney()))
415 return false;
416
417 return true;
418}
bool SatisfyQuestDay(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1262
bool SatisfyQuestMonth(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1320
bool SatisfyQuestSeasonal(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1305
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: PlayerQuest.cpp:1424
bool SatisfyQuestWeek(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1296

References EQUIP_ERR_ITEM_NOT_FOUND, GetItemCount(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestRewardStatus(), GetQuestStatus(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), Quest::IsDFQuest(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_COMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, SatisfyQuestDay(), SatisfyQuestMonth(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), and SendEquipError().

Referenced by CanCompleteRepeatableQuest(), CanRewardQuest(), lfg::LFGMgr::FinishDungeon(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), npc_elder_clearwater::OnGossipHello(), and SendPreparedQuest().

◆ CanRewardQuest() [2/2]

bool Player::CanRewardQuest ( Quest const *  quest,
uint32  reward,
bool  msg 
)
468{
469 // prevent receive reward with quest items in bank or for not completed quest
470 if (!CanRewardQuest(quest, msg))
471 return false;
472
473 ItemPosCountVec dest;
474 if (quest->GetRewChoiceItemsCount() > 0)
475 {
476 if (quest->RewardChoiceItemId[reward])
477 {
478 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]);
479 if (res != EQUIP_ERR_OK)
480 {
481 SendEquipError(res, nullptr, nullptr, quest->RewardChoiceItemId[reward]);
482 return false;
483 }
484 }
485 }
486
487 if (quest->GetRewItemsCount() > 0)
488 {
489 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
490 {
491 if (quest->RewardItemId[i])
492 {
493 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]);
494 if (res != EQUIP_ERR_OK)
495 {
496 SendEquipError(res, nullptr, nullptr, quest->RewardItemId[i]);
497 return false;
498 }
499 }
500 }
501 }
502
503 return true;
504}

References CanRewardQuest(), CanStoreNewItem(), EQUIP_ERR_OK, Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), NULL_BAG, NULL_SLOT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardItemId, Quest::RewardItemIdCount, and SendEquipError().

◆ CanRollForItemInLFG()

InventoryResult Player::CanRollForItemInLFG ( ItemTemplate const *  item,
WorldObject const *  lootedObject 
) const
2353{
2354 if (!GetGroup() || !GetGroup()->isLFGGroup(true))
2355 return EQUIP_ERR_OK; // not in LFG group
2356
2357 // check if looted object is inside the lfg dungeon
2358 Map const* map = lootedObject->GetMap();
2359 if (!sLFGMgr->inLfgDungeonMap(GetGroup()->GetGUID(), map->GetId(), map->GetDifficulty()))
2360 return EQUIP_ERR_OK;
2361
2362 if (!proto)
2364 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2365
2366 const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
2367 {
2373 }; //Copy from function Item::GetSkill()
2374
2375 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2377
2378 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2380
2381 if (proto->RequiredSkill != 0)
2382 {
2383 if (!GetSkillValue(proto->RequiredSkill))
2385 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2387 }
2388
2389 if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
2391
2392 if (proto->Class == ITEM_CLASS_ARMOR)
2393 {
2394 // Check for shields
2395 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(
2399 {
2401 }
2402
2403 // Check for librams.
2405 {
2407 }
2408
2409 // CHeck for idols.
2411 {
2413 }
2414
2415 // Check for totems.
2417 {
2419 }
2420
2421 // Check for sigils.
2423 {
2425 }
2426 }
2427
2428 if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER &&
2429 proto->InventoryType != INVTYPE_CLOAK)
2430 {
2431 uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
2433 {
2434 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2435 }
2437 {
2438 if ((proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat()))
2439 {
2441 }
2442 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2443 }
2445 {
2446 subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
2447 }
2449 {
2450 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2451 }
2453 {
2454 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2455 {
2457 }
2458 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2459 }
2460
2461 if (proto->SubClass > subclassToCompare)
2462 {
2464 }
2465 else if (sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION) && proto->ItemLevel > sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION))
2466 {
2467 if (proto->SubClass < subclassToCompare)
2468 {
2470 }
2471 }
2472 }
2473
2474 return EQUIP_ERR_OK;
2475}
@ EQUIP_ERR_CANT_EQUIP_SKILL
Definition: Item.h:49
@ EQUIP_ERR_NO_REQUIRED_PROFICIENCY
Definition: Item.h:55
@ EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM
Definition: Item.h:57
@ INVTYPE_CLOAK
Definition: ItemTemplate.h:272
@ ITEM_SUBCLASS_ARMOR_BUCKLER
Definition: ItemTemplate.h:395
@ ITEM_SUBCLASS_ARMOR_LIBRAM
Definition: ItemTemplate.h:397
@ ITEM_SUBCLASS_ARMOR_MISC
Definition: ItemTemplate.h:390
@ ITEM_SUBCLASS_ARMOR_SIGIL
Definition: ItemTemplate.h:400
@ ITEM_SUBCLASS_ARMOR_TOTEM
Definition: ItemTemplate.h:399
@ ITEM_SUBCLASS_ARMOR_IDOL
Definition: ItemTemplate.h:398
#define MAX_ITEM_SUBCLASS_WEAPON
Definition: ItemTemplate.h:371
@ CLASS_CONTEXT_EQUIP_SHIELDS
Definition: UnitDefines.h:218
@ CLASS_CONTEXT_EQUIP_RELIC
Definition: UnitDefines.h:217
@ CLASS_CONTEXT_EQUIP_ARMOR_CLASS
Definition: UnitDefines.h:219
#define sLFGMgr
Definition: LFGMgr.h:641
@ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION
Definition: IWorld.h:418
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ SKILL_BOWS
Definition: SharedDefines.h:2873
@ SKILL_MACES
Definition: SharedDefines.h:2877
@ SKILL_WANDS
Definition: SharedDefines.h:2941
@ SKILL_GUNS
Definition: SharedDefines.h:2874
@ SKILL_CROSSBOWS
Definition: SharedDefines.h:2940
@ SKILL_THROWN
Definition: SharedDefines.h:2914
@ SKILL_FISHING
Definition: SharedDefines.h:2957
@ SKILL_SWORDS
Definition: SharedDefines.h:2871
@ SKILL_DAGGERS
Definition: SharedDefines.h:2913
@ SKILL_2H_AXES
Definition: SharedDefines.h:2912
@ SKILL_POLEARMS
Definition: SharedDefines.h:2942
@ SKILL_2H_SWORDS
Definition: SharedDefines.h:2878
@ SKILL_FIST_WEAPONS
Definition: SharedDefines.h:2966
@ SKILL_2H_MACES
Definition: SharedDefines.h:2906
@ SKILL_AXES
Definition: SharedDefines.h:2872
@ SKILL_STAVES
Definition: SharedDefines.h:2894
@ SKILL_ASSASSINATION
Definition: SharedDefines.h:2946
uint32 getRaceMask() const
Definition: Unit.h:764
uint32 GetId() const
Definition: Map.h:379
Difficulty GetDifficulty() const
Definition: Map.h:443

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_CONTEXT_EQUIP_RELIC, CLASS_CONTEXT_EQUIP_SHIELDS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_PALADIN, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARRIOR, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Map::GetDifficulty(), GetGroup(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), Unit::getRaceMask(), GetSkillValue(), HasSpell(), ItemTemplate::HasSpellPowerStat(), ItemTemplate::HasStat(), ItemTemplate::InventoryType, INVTYPE_CLOAK, IsClass(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, ITEM_MOD_SPELL_POWER, ITEM_SUBCLASS_ARMOR_BUCKLER, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ItemTemplate::ItemLevel, MAX_ITEM_SUBCLASS_WEAPON, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, SKILL_2H_AXES, SKILL_2H_MACES, SKILL_2H_SWORDS, SKILL_ASSASSINATION, SKILL_AXES, SKILL_BOWS, SKILL_CROSSBOWS, SKILL_DAGGERS, SKILL_FISHING, SKILL_FIST_WEAPONS, SKILL_GUNS, SKILL_MACES, SKILL_POLEARMS, SKILL_STAVES, SKILL_SWORDS, SKILL_THROWN, SKILL_WANDS, sLFGMgr, ItemTemplate::SubClass, and sWorld.

Referenced by Group::NeedBeforeGreed().

◆ CanSeeDKPet()

bool Player::CanSeeDKPet ( ) const
inline

◆ CanSeeSpellClickOn()

bool Player::CanSeeSpellClickOn ( Creature const *  creature) const
14227{
14228 if (!c->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
14229 return false;
14230
14231 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(c->GetEntry());
14232 if (clickPair.first == clickPair.second)
14233 return true;
14234
14235 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
14236 {
14237 if (!itr->second.IsFitToRequirements(this, c))
14238 return false;
14239
14240 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId);
14241 ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c));
14242 if (sConditionMgr->IsObjectMeetToConditions(info, conds))
14243 return true;
14244 }
14245
14246 return false;
14247}
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:409
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:318
Definition: ConditionMgr.h:181

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, sObjectMgr, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Unit::PatchValuesUpdate().

◆ CanSeeStartQuest()

bool Player::CanSeeStartQuest ( Quest const *  quest)
238{
239 if (!DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
240 SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
241 SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
242 SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
243 SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
244 {
245 return GetLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
246 }
247
248 return false;
249}
@ DISABLE_TYPE_QUEST
Definition: DisableMgr.h:30
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition: IWorld.h:292
bool IsDisabledFor(DisableType type, uint32 entry, Unit const *unit, uint8 flags)
Definition: DisableMgr.cpp:306
bool SatisfyQuestNextChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1214
bool SatisfyQuestExclusiveGroup(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1177
bool SatisfyQuestRace(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1097
bool SatisfyQuestClass(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1079
bool SatisfyQuestReputation(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1111
bool SatisfyQuestPreviousQuest(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:993
bool SatisfyQuestSkill(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:941
bool SatisfyQuestPrevChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1234

References CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, DISABLE_TYPE_QUEST, Unit::GetLevel(), Quest::GetMinLevel(), Quest::GetQuestId(), DisableMgr::IsDisabledFor(), SatisfyQuestClass(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestWeek(), and sWorld.

Referenced by npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverCompleteQuest().

◆ CanSeeVendor()

bool Player::CanSeeVendor ( Creature const *  creature) const
14250{
14251 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR))
14252 return true;
14253
14254 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0);
14255 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions))
14256 {
14257 return false;
14258 }
14259
14260 return true;
14261}

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, and UNIT_NPC_FLAG_VENDOR.

Referenced by Unit::PatchValuesUpdate().

◆ CanShareQuest()

bool Player::CanShareQuest ( uint32  quest_id) const
1453{
1454 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1455 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
1456 {
1457 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1458 if (itr != m_QuestStatus.end())
1459 {
1460 // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
1461 if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
1462 {
1464 return false;
1465 }
1466
1467 return true;
1468 }
1469 }
1470 return false;
1471}
@ QUEST_FLAGS_SHARABLE
Definition: QuestDef.h:135
@ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY
Definition: QuestDef.h:74
#define sPoolMgr
Definition: PoolMgr.h:163
void SendPushToPartyResponse(Player const *player, uint8 msg) const
Definition: PlayerQuest.cpp:2429
bool HasFlag(uint32 flag) const
Definition: QuestDef.h:220

References Quest::HasFlag(), m_QuestStatus, QUEST_FLAGS_SHARABLE, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY, SendPushToPartyResponse(), sObjectMgr, and sPoolMgr.

Referenced by WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ CanSpeak()

bool Player::CanSpeak ( ) const
70{
71 return GetSession()->m_muteTime <= time (nullptr);
72}
time_t m_muteTime
Definition: WorldSession.h:494

References GetSession(), and WorldSession::m_muteTime.

Referenced by WorldSession::HandleMessagechatOpcode(), and misc_commandscript::HandleUnmuteCommand().

◆ CanStoreItem() [1/2]

◆ CanStoreItem() [2/2]

InventoryResult Player::CanStoreItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
uint32  entry,
uint32  count,
Item pItem = nullptr,
bool  swap = false,
uint32 no_space_count = nullptr 
) const
1125{
1126 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, entry, count);
1127
1128 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
1129 if (!pProto)
1130 {
1131 if (no_space_count)
1132 *no_space_count = count;
1134 }
1135
1136 if (pItem)
1137 {
1138 // you bad chet0rz, wpe pro
1139 if( bag == NULL_BAG && slot == NULL_SLOT )
1140 if( pItem->IsBag() && pItem->IsNotEmptyBag() )
1142
1143 // Xinef: Removed next loot generated check
1144 if (pItem->GetGUID() == GetLootGUID())
1145 {
1146 if (no_space_count)
1147 *no_space_count = count;
1149 }
1150
1151 if (pItem->IsBindedNotWith(this))
1152 {
1153 if (no_space_count)
1154 *no_space_count = count;
1156 }
1157 }
1158
1159 // check count of items (skip for auto move for same player from bank)
1160 uint32 no_similar_count = 0; // can't store this amount similar items
1161 InventoryResult res = CanTakeMoreSimilarItems(entry, count, pItem, &no_similar_count);
1162 if (res != EQUIP_ERR_OK)
1163 {
1164 if (count == no_similar_count)
1165 {
1166 if (no_space_count)
1167 *no_space_count = no_similar_count;
1168 return res;
1169 }
1170 count -= no_similar_count;
1171 }
1172
1173 // in specific slot
1174 if (bag != NULL_BAG && slot != NULL_SLOT)
1175 {
1176 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
1177 if (res != EQUIP_ERR_OK)
1178 {
1179 if (no_space_count)
1180 *no_space_count = count + no_similar_count;
1181 return res;
1182 }
1183
1184 if (count == 0)
1185 {
1186 if (no_similar_count == 0)
1187 return EQUIP_ERR_OK;
1188
1189 if (no_space_count)
1190 *no_space_count = count + no_similar_count;
1192 }
1193 }
1194
1195 // not specific slot or have space for partly store only in specific slot
1196
1197 // in specific bag
1198 if (bag != NULL_BAG)
1199 {
1200 // search stack in bag for merge to
1201 if (pProto->Stackable != 1)
1202 {
1203 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1204 {
1205 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1206 if (res != EQUIP_ERR_OK)
1207 {
1208 if (no_space_count)
1209 *no_space_count = count + no_similar_count;
1210 return res;
1211 }
1212
1213 if (count == 0)
1214 {
1215 if (no_similar_count == 0)
1216 return EQUIP_ERR_OK;
1217
1218 if (no_space_count)
1219 *no_space_count = count + no_similar_count;
1221 }
1222
1223 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1224 if (res != EQUIP_ERR_OK)
1225 {
1226 if (no_space_count)
1227 *no_space_count = count + no_similar_count;
1228 return res;
1229 }
1230
1231 if (count == 0)
1232 {
1233 if (no_similar_count == 0)
1234 return EQUIP_ERR_OK;
1235
1236 if (no_space_count)
1237 *no_space_count = count + no_similar_count;
1239 }
1240 }
1241 else // equipped bag
1242 {
1243 // we need check 2 time (specialized/non_specialized), use NULL_BAG to prevent skipping bag
1244 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
1245 if (res != EQUIP_ERR_OK)
1246 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
1247
1248 if (res != EQUIP_ERR_OK)
1249 {
1250 if (no_space_count)
1251 *no_space_count = count + no_similar_count;
1252 return res;
1253 }
1254
1255 if (count == 0)
1256 {
1257 if (no_similar_count == 0)
1258 return EQUIP_ERR_OK;
1259
1260 if (no_space_count)
1261 *no_space_count = count + no_similar_count;
1263 }
1264 }
1265 }
1266
1267 // search free slot in bag for place to
1268 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1269 {
1270 // search free slot - keyring case
1271 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1272 {
1273 uint32 keyringSize = GetMaxKeyringSize();
1274 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1275 if (res != EQUIP_ERR_OK)
1276 {
1277 if (no_space_count)
1278 *no_space_count = count + no_similar_count;
1279 return res;
1280 }
1281
1282 if (count == 0)
1283 {
1284 if (no_similar_count == 0)
1285 return EQUIP_ERR_OK;
1286
1287 if (no_space_count)
1288 *no_space_count = count + no_similar_count;
1290 }
1291
1292 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1293 if (res != EQUIP_ERR_OK)
1294 {
1295 if (no_space_count)
1296 *no_space_count = count + no_similar_count;
1297 return res;
1298 }
1299
1300 if (count == 0)
1301 {
1302 if (no_similar_count == 0)
1303 return EQUIP_ERR_OK;
1304
1305 if (no_space_count)
1306 *no_space_count = count + no_similar_count;
1308 }
1309 }
1310 else if (pProto->IsCurrencyToken())
1311 {
1312 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1313 if (res != EQUIP_ERR_OK)
1314 {
1315 if (no_space_count)
1316 *no_space_count = count + no_similar_count;
1317 return res;
1318 }
1319
1320 if (count == 0)
1321 {
1322 if (no_similar_count == 0)
1323 return EQUIP_ERR_OK;
1324
1325 if (no_space_count)
1326 *no_space_count = count + no_similar_count;
1328 }
1329 }
1330
1331 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1332 if (res != EQUIP_ERR_OK)
1333 {
1334 if (no_space_count)
1335 *no_space_count = count + no_similar_count;
1336 return res;
1337 }
1338
1339 if (count == 0)
1340 {
1341 if (no_similar_count == 0)
1342 return EQUIP_ERR_OK;
1343
1344 if (no_space_count)
1345 *no_space_count = count + no_similar_count;
1347 }
1348 }
1349 else // equipped bag
1350 {
1351 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
1352 if (res != EQUIP_ERR_OK)
1353 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
1354
1355 if (res != EQUIP_ERR_OK)
1356 {
1357 if (no_space_count)
1358 *no_space_count = count + no_similar_count;
1359 return res;
1360 }
1361
1362 if (count == 0)
1363 {
1364 if (no_similar_count == 0)
1365 return EQUIP_ERR_OK;
1366
1367 if (no_space_count)
1368 *no_space_count = count + no_similar_count;
1370 }
1371 }
1372 }
1373
1374 // not specific bag or have space for partly store only in specific bag
1375
1376 // search stack for merge to
1377 if (pProto->Stackable != 1)
1378 {
1379 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1380 if (res != EQUIP_ERR_OK)
1381 {
1382 if (no_space_count)
1383 *no_space_count = count + no_similar_count;
1384 return res;
1385 }
1386
1387 if (count == 0)
1388 {
1389 if (no_similar_count == 0)
1390 return EQUIP_ERR_OK;
1391
1392 if (no_space_count)
1393 *no_space_count = count + no_similar_count;
1395 }
1396
1397 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1398 if (res != EQUIP_ERR_OK)
1399 {
1400 if (no_space_count)
1401 *no_space_count = count + no_similar_count;
1402 return res;
1403 }
1404
1405 if (count == 0)
1406 {
1407 if (no_similar_count == 0)
1408 return EQUIP_ERR_OK;
1409
1410 if (no_space_count)
1411 *no_space_count = count + no_similar_count;
1413 }
1414
1415 if (pProto->BagFamily)
1416 {
1418 {
1419 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
1420 if (res != EQUIP_ERR_OK)
1421 continue;
1422
1423 if (count == 0)
1424 {
1425 if (no_similar_count == 0)
1426 return EQUIP_ERR_OK;
1427
1428 if (no_space_count)
1429 *no_space_count = count + no_similar_count;
1431 }
1432 }
1433 }
1434
1436 {
1437 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
1438 if (res != EQUIP_ERR_OK)
1439 continue;
1440
1441 if (count == 0)
1442 {
1443 if (no_similar_count == 0)
1444 return EQUIP_ERR_OK;
1445
1446 if (no_space_count)
1447 *no_space_count = count + no_similar_count;
1449 }
1450 }
1451 }
1452
1453 // search free slot - special bag case
1454 if (pProto->BagFamily)
1455 {
1456 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1457 {
1458 uint32 keyringSize = GetMaxKeyringSize();
1459 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1460 if (res != EQUIP_ERR_OK)
1461 {
1462 if (no_space_count)
1463 *no_space_count = count + no_similar_count;
1464 return res;
1465 }
1466
1467 if (count == 0)
1468 {
1469 if (no_similar_count == 0)
1470 return EQUIP_ERR_OK;
1471
1472 if (no_space_count)
1473 *no_space_count = count + no_similar_count;
1475 }
1476 }
1477 else if (pProto->IsCurrencyToken())
1478 {
1479 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1480 if (res != EQUIP_ERR_OK)
1481 {
1482 if (no_space_count)
1483 *no_space_count = count + no_similar_count;
1484 return res;
1485 }
1486
1487 if (count == 0)
1488 {
1489 if (no_similar_count == 0)
1490 return EQUIP_ERR_OK;
1491
1492 if (no_space_count)
1493 *no_space_count = count + no_similar_count;
1495 }
1496 }
1497
1499 {
1500 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
1501 if (res != EQUIP_ERR_OK)
1502 continue;
1503
1504 if (count == 0)
1505 {
1506 if (no_similar_count == 0)
1507 return EQUIP_ERR_OK;
1508
1509 if (no_space_count)
1510 *no_space_count = count + no_similar_count;
1512 }
1513 }
1514 }
1515
1516 if (pItem && pItem->IsNotEmptyBag())
1518
1519 // search free slot
1520 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1521 if (res != EQUIP_ERR_OK)
1522 {
1523 if (no_space_count)
1524 *no_space_count = count + no_similar_count;
1525 return res;
1526 }
1527
1528 if (count == 0)
1529 {
1530 if (no_similar_count == 0)
1531 return EQUIP_ERR_OK;
1532
1533 if (no_space_count)
1534 *no_space_count = count + no_similar_count;
1536 }
1537
1539 {
1540 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
1541 if (res != EQUIP_ERR_OK)
1542 continue;
1543
1544 if (count == 0)
1545 {
1546 if (no_similar_count == 0)
1547 return EQUIP_ERR_OK;
1548
1549 if (no_space_count)
1550 *no_space_count = count + no_similar_count;
1552 }
1553 }
1554
1555 if (no_space_count)
1556 *no_space_count = count + no_similar_count;
1557
1559}
@ EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS
Definition: Item.h:78
@ BAG_FAMILY_MASK_KEYS
Definition: ItemTemplate.h:235
@ INVENTORY_SLOT_ITEM_START
Definition: Player.h:705
@ INVENTORY_SLOT_ITEM_END
Definition: Player.h:706
bool IsCurrencyToken() const
Definition: ItemTemplate.h:727
uint32 GetMaxKeyringSize() const
Definition: Player.h:1345

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, Object::GetGUID(), GetLootGUID(), GetMaxKeyringSize(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBag(), Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsNotEmptyBag(), KEYRING_SLOT_START, LOG_DEBUG, NULL_BAG, NULL_SLOT, sObjectMgr, and ItemTemplate::Stackable.

◆ CanStoreItem_InBag()

InventoryResult Player::CanStoreItem_InBag ( uint8  bag,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
bool  non_specialized,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1004{
1005 // skip specific bag already processed in first called CanStoreItem_InBag
1006 if (bag == skip_bag)
1008
1009 // skip not existed bag or self targeted bag
1010 Bag* pBag = GetBagByPos(bag);
1011 if (!pBag || pBag == pSrcItem || (pSrcItem && (pSrcItem->GetGUID() == pBag->GetGUID())) )
1013
1014 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1016
1017 ItemTemplate const* pBagProto = pBag->GetTemplate();
1018 if (!pBagProto)
1020
1021 // specialized bag mode or non-specilized
1022 if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER))
1024
1025 if (!ItemCanGoIntoBag(pProto, pBagProto))
1027
1028 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1029 {
1030 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1031 if (j == skip_slot)
1032 continue;
1033
1034 Item* pItem2 = GetItemByPos(bag, j);
1035
1036 // ignore move item (this slot will be empty at move)
1037 if (pItem2 == pSrcItem)
1038 pItem2 = nullptr;
1039
1040 // if merge skip empty, if !merge skip non-empty
1041 if ((pItem2 != nullptr) != merge)
1042 continue;
1043
1044 uint32 need_space = pProto->GetMaxStackSize();
1045
1046 if (pItem2)
1047 {
1048 // can be merged at least partly
1049 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1050 if (res != EQUIP_ERR_OK)
1051 continue;
1052
1053 // descrease at current stacksize
1054 need_space -= pItem2->GetCount();
1055 }
1056
1057 if (need_space > count)
1058 need_space = count;
1059
1060 ItemPosCount newPosition = ItemPosCount((bag << 8) | j, need_space);
1061 if (!newPosition.isContainedIn(dest))
1062 {
1063 dest.push_back(newPosition);
1064 count -= need_space;
1065
1066 if (count == 0)
1067 return EQUIP_ERR_OK;
1068 }
1069 }
1070 return EQUIP_ERR_OK;
1071}
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
Definition: Item.cpp:177
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition: Item.h:62
@ ITEM_SUBCLASS_CONTAINER
Definition: ItemTemplate.h:329
@ ITEM_CLASS_CONTAINER
Definition: ItemTemplate.h:292
uint32 GetBagSize() const
Definition: Bag.h:48
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
Definition: Item.cpp:868
Definition: Player.h:765
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
Definition: Player.cpp:13095

References Item::CanBeMergedPartlyWith(), ItemTemplate::Class, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Bag::GetBagSize(), Item::GetCount(), Object::GetGUID(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), ItemPosCount::isContainedIn(), Item::IsNotEmptyBag(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), and ItemTemplate::SubClass.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InInventorySlots()

InventoryResult Player::CanStoreItem_InInventorySlots ( uint8  slot_begin,
uint8  slot_end,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1074{
1075 //this is never called for non-bag slots so we can do this
1076 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1078
1079 for (uint32 j = slot_begin; j < slot_end; j++)
1080 {
1081 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1082 if (INVENTORY_SLOT_BAG_0 == skip_bag && j == skip_slot)
1083 continue;
1084
1086
1087 // ignore move item (this slot will be empty at move)
1088 if (pItem2 == pSrcItem)
1089 pItem2 = nullptr;
1090
1091 // if merge skip empty, if !merge skip non-empty
1092 if ((pItem2 != nullptr) != merge)
1093 continue;
1094
1095 uint32 need_space = pProto->GetMaxStackSize();
1096
1097 if (pItem2)
1098 {
1099 // can be merged at least partly
1100 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1101 if (res != EQUIP_ERR_OK)
1102 continue;
1103
1104 // descrease at current stacksize
1105 need_space -= pItem2->GetCount();
1106 }
1107
1108 if (need_space > count)
1109 need_space = count;
1110
1111 ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
1112 if (!newPosition.isContainedIn(dest))
1113 {
1114 dest.push_back(newPosition);
1115 count -= need_space;
1116
1117 if (count == 0)
1118 return EQUIP_ERR_OK;
1119 }
1120 }
1121 return EQUIP_ERR_OK;
1122}

References Item::CanBeMergedPartlyWith(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_OK, Item::GetCount(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), and Item::IsNotEmptyBag().

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InSpecificSlot()

InventoryResult Player::CanStoreItem_InSpecificSlot ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  swap,
Item pSrcItem 
) const
private
933{
934 Item* pItem2 = GetItemByPos(bag, slot);
935
936 // ignore move item (this slot will be empty at move)
937 if (pItem2 == pSrcItem)
938 pItem2 = nullptr;
939
940 uint32 need_space;
941
942 // empty specific slot - check item fit to slot
943 if (!pItem2 || swap)
944 {
945 if (bag == INVENTORY_SLOT_BAG_0)
946 {
947 // keyring case
948 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START + GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
950
951 // currencytoken case
952 if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken()))
954
955 // prevent cheating
956 if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
958 }
959 else
960 {
961 Bag* pBag = GetBagByPos(bag);
962 if (!pBag)
964
965 ItemTemplate const* pBagProto = pBag->GetTemplate();
966 if (!pBagProto)
968
969 if (slot >= pBagProto->ContainerSlots)
971
972 if (!ItemCanGoIntoBag(pProto, pBagProto))
974 }
975
976 // non empty stack with space
977 need_space = pProto->GetMaxStackSize();
978 }
979 // non empty slot, check item type
980 else
981 {
982 // can be merged at least partly
983 InventoryResult res = pItem2->CanBeMergedPartlyWith(pProto);
984 if (res != EQUIP_ERR_OK)
985 return res;
986
987 // free stack space or infinity
988 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
989 }
990
991 if (need_space > count)
992 need_space = count;
993
994 ItemPosCount newPosition = ItemPosCount((bag << 8) | slot, need_space);
995 if (!newPosition.isContainedIn(dest))
996 {
997 dest.push_back(newPosition);
998 count -= need_space;
999 }
1000 return EQUIP_ERR_OK;
1001}
uint32 ContainerSlots
Definition: ItemTemplate.h:646

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, BUYBACK_SLOT_END, BUYBACK_SLOT_START, Item::CanBeMergedPartlyWith(), ItemTemplate::ContainerSlots, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), GetItemByPos(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), ItemTemplate::IsCurrencyToken(), ItemCanGoIntoBag(), KEYRING_SLOT_START, and PLAYER_SLOT_END.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItems()

InventoryResult Player::CanStoreItems ( Item **  pItem,
int32  count 
) const
1563{
1564 Item* pItem2;
1565
1566 // fill space table
1569 int inv_keys[KEYRING_SLOT_END - KEYRING_SLOT_START];
1571
1572 memset(inv_slot_items, 0, sizeof(int) * (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START));
1573 memset(inv_bags, 0, sizeof(int) * (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) * MAX_BAG_SIZE);
1574 memset(inv_keys, 0, sizeof(int) * (KEYRING_SLOT_END - KEYRING_SLOT_START));
1575 memset(inv_tokens, 0, sizeof(int) * (CURRENCYTOKEN_SLOT_END - CURRENCYTOKEN_SLOT_START));
1576
1578 {
1580 if (pItem2 && !pItem2->IsInTrade())
1581 inv_slot_items[i - INVENTORY_SLOT_ITEM_START] = pItem2->GetCount();
1582 }
1583
1584 for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
1585 {
1587 if (pItem2 && !pItem2->IsInTrade())
1588 inv_keys[i - KEYRING_SLOT_START] = pItem2->GetCount();
1589 }
1590
1592 {
1594 if (pItem2 && !pItem2->IsInTrade())
1595 inv_tokens[i - CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
1596 }
1597
1599 if (Bag* pBag = GetBagByPos(i))
1600 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1601 {
1602 pItem2 = GetItemByPos(i, j);
1603 if (pItem2 && !pItem2->IsInTrade())
1604 inv_bags[i - INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
1605 }
1606
1607 // check free space for all items
1608 for (int k = 0; k < count; ++k)
1609 {
1610 Item* pItem = pItems[k];
1611
1612 // no item
1613 if (!pItem)
1614 continue;
1615
1616 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItems {}. item = {}, count = {}", k + 1, pItem->GetEntry(), pItem->GetCount());
1617 ItemTemplate const* pProto = pItem->GetTemplate();
1618
1619 // strange item
1620 if (!pProto)
1622
1623 // Xinef: Removed next loot generated check
1624 if (pItem->GetGUID() == GetLootGUID())
1626
1627 // item it 'bind'
1628 if (pItem->IsBindedNotWith(this))
1630
1631 ItemTemplate const* pBagProto;
1632
1633 // item is 'one item only'
1635 if (res != EQUIP_ERR_OK)
1636 return res;
1637
1638 // search stack for merge to
1639 if (pProto->Stackable != 1)
1640 {
1641 bool b_found = false;
1642
1643 for (uint8 t = KEYRING_SLOT_START; t < KEYRING_SLOT_END; ++t)
1644 {
1646 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_keys[t - KEYRING_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1647 {
1648 inv_keys[t - KEYRING_SLOT_START] += pItem->GetCount();
1649 b_found = true;
1650 break;
1651 }
1652 }
1653 if (b_found)
1654 continue;
1655
1656 for (int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
1657 {
1659 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_tokens[t - CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1660 {
1661 inv_tokens[t - CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
1662 b_found = true;
1663 break;
1664 }
1665 }
1666 if (b_found)
1667 continue;
1668
1670 {
1672 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_slot_items[t - INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1673 {
1674 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] += pItem->GetCount();
1675 b_found = true;
1676 break;
1677 }
1678 }
1679 if (b_found)
1680 continue;
1681
1682 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1683 {
1684 if (Bag* bag = GetBagByPos(t))
1685 {
1686 if (ItemCanGoIntoBag(pItem->GetTemplate(), bag->GetTemplate()))
1687 {
1688 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1689 {
1690 pItem2 = GetItemByPos(t, j);
1691 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_bags[t - INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->GetMaxStackSize())
1692 {
1693 inv_bags[t - INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
1694 b_found = true;
1695 break;
1696 }
1697 }
1698 }
1699 }
1700 }
1701 if (b_found)
1702 continue;
1703 }
1704
1705 // special bag case
1706 if (pProto->BagFamily)
1707 {
1708 bool b_found = false;
1709 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1710 {
1711 uint32 keyringSize = GetMaxKeyringSize();
1712 for (uint32 t = KEYRING_SLOT_START; t < KEYRING_SLOT_START + keyringSize; ++t)
1713 {
1714 if (inv_keys[t - KEYRING_SLOT_START] == 0)
1715 {
1716 inv_keys[t - KEYRING_SLOT_START] = 1;
1717 b_found = true;
1718 break;
1719 }
1720 }
1721 }
1722
1723 if (b_found)
1724 continue;
1725
1726 if (pProto->IsCurrencyToken())
1727 {
1729 {
1730 if (inv_tokens[t - CURRENCYTOKEN_SLOT_START] == 0)
1731 {
1732 inv_tokens[t - CURRENCYTOKEN_SLOT_START] = 1;
1733 b_found = true;
1734 break;
1735 }
1736 }
1737 }
1738
1739 if (b_found)
1740 continue;
1741
1742 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1743 {
1744 if (Bag* bag = GetBagByPos(t))
1745 {
1746 pBagProto = bag->GetTemplate();
1747
1748 // not plain container check
1749 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
1750 ItemCanGoIntoBag(pProto, pBagProto))
1751 {
1752 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1753 {
1754 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1755 {
1756 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1757 b_found = true;
1758 break;
1759 }
1760 }
1761 }
1762 }
1763 }
1764 if (b_found)
1765 continue;
1766 }
1767
1768 // search free slot
1769 bool b_found = false;
1771 {
1772 if (inv_slot_items[t - INVENTORY_SLOT_ITEM_START] == 0)
1773 {
1774 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] = 1;
1775 b_found = true;
1776 break;
1777 }
1778 }
1779 if (b_found)
1780 continue;
1781
1782 // search free slot in bags
1783 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1784 {
1785 if (Bag* bag = GetBagByPos(t))
1786 {
1787 pBagProto = bag->GetTemplate();
1788
1789 // special bag already checked
1790 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER))
1791 continue;
1792
1793 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1794 {
1795 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1796 {
1797 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1798 b_found = true;
1799 break;
1800 }
1801 }
1802 }
1803 }
1804
1805 // no free slot found?
1806 if (!b_found)
1808 }
1809
1810 return EQUIP_ERR_OK;
1811}
@ KEYRING_SLOT_END
Definition: Player.h:731
bool IsInTrade() const
Definition: Item.h:260

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, Item::CanBeMergedPartlyWith(), CanTakeMoreSimilarItems(), ItemTemplate::Class, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetLootGUID(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsInTrade(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), KEYRING_SLOT_END, KEYRING_SLOT_START, LOG_DEBUG, MAX_BAG_SIZE, ItemTemplate::Stackable, and ItemTemplate::SubClass.

Referenced by WorldSession::HandleAcceptTradeOpcode().

◆ CanStoreNewItem()

◆ CanTakeMoreSimilarItems() [1/3]

InventoryResult Player::CanTakeMoreSimilarItems ( Item pItem) const
inline

◆ CanTakeMoreSimilarItems() [2/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count 
) const
inline
1270{ return CanTakeMoreSimilarItems(entry, count, nullptr); }

References CanTakeMoreSimilarItems().

Referenced by CanTakeMoreSimilarItems().

◆ CanTakeMoreSimilarItems() [3/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count,
Item pItem,
uint32 no_space_count = nullptr 
) const
824{
825 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
826 if (!pProto)
827 {
828 if (no_space_count)
829 *no_space_count = count;
831 }
832
833 // no maximum
834 if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647)
835 return EQUIP_ERR_OK;
836
837 if (pProto->MaxCount > 0)
838 {
839 uint32 curcount = GetItemCount(pProto->ItemId, true, pItem);
840 if (curcount + count > uint32(pProto->MaxCount))
841 {
842 if (no_space_count)
843 *no_space_count = count + curcount - pProto->MaxCount;
845 }
846 }
847
848 // check unique-equipped limit
849 if (pProto->ItemLimitCategory)
850 {
851 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->ItemLimitCategory);
852 if (!limitEntry)
853 {
854 if (no_space_count)
855 *no_space_count = count;
857 }
858
859 if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE)
860 {
861 uint32 curcount = GetItemCountWithLimitCategory(pProto->ItemLimitCategory, pItem);
862 if (curcount + count > uint32(limitEntry->maxCount))
863 {
864 if (no_space_count)
865 *no_space_count = count + curcount - limitEntry->maxCount;
867 }
868 }
869 }
870
871 return EQUIP_ERR_OK;
872}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
Definition: Item.h:130
@ ITEM_LIMIT_CATEGORY_MODE_HAVE
Definition: DBCEnums.h:379
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:395
uint32 mode
Definition: DBCStructure.h:1201

References EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_OK, GetItemCount(), GetItemCountWithLimitCategory(), ITEM_LIMIT_CATEGORY_MODE_HAVE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemTemplate::MaxCount, ItemLimitCategoryEntry::maxCount, ItemLimitCategoryEntry::mode, sItemLimitCategoryStore, and sObjectMgr.

◆ CanTakeQuest()

bool Player::CanTakeQuest ( Quest const *  quest,
bool  msg 
)
252{
253 return !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
254 && SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
255 && SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
256 && SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
257 && SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
258 && SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
259 && SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
260 && SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
261 && SatisfyQuestConditions(quest, msg);
262}
bool SatisfyQuestConditions(Quest const *qInfo, bool msg)
Definition: PlayerQuest.cpp:1153
bool SatisfyQuestTimed(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1166
bool SatisfyQuestLevel(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:961
bool SatisfyQuestStatus(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1142

References DISABLE_TYPE_QUEST, Quest::GetQuestId(), DisableMgr::IsDisabledFor(), SatisfyQuestClass(), SatisfyQuestConditions(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestLevel(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestStatus(), SatisfyQuestTimed(), and SatisfyQuestWeek().

Referenced by CanCompleteQuest(), CanCompleteRepeatableQuest(), Spell::EffectQuestComplete(), Spell::EffectQuestStart(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), npc_wg_quest_giver::OnGossipHello(), PrepareQuestMenu(), SendPreparedQuest(), and npc_costumed_orphan_matron::sGossipHello().

◆ CanTameExoticPets()

bool Player::CanTameExoticPets ( ) const
inline

◆ CanTeleport()

bool Player::CanTeleport ( )
inline
2473{ return m_canTeleport; }

References m_canTeleport.

◆ CanTitanGrip()

bool Player::CanTitanGrip ( ) const
inline

◆ CanUnequipItem()

InventoryResult Player::CanUnequipItem ( uint16  src,
bool  swap 
) const
2000{
2001 if (!sScriptMgr->CanUnequipItem(const_cast<Player*>(this), pos, swap))
2003
2004 // Applied only to equipped items and bank bags
2005 if (!IsEquipmentPos(pos) && !IsBagPos(pos))
2006 return EQUIP_ERR_OK;
2007
2008 Item* pItem = GetItemByPos(pos);
2009
2010 // Applied only to existed equipped item
2011 if (!pItem)
2012 return EQUIP_ERR_OK;
2013
2014 LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = {}, item = {}, count = {}", pos, pItem->GetEntry(), pItem->GetCount());
2015
2016 ItemTemplate const* pProto = pItem->GetTemplate();
2017 if (!pProto)
2019
2020 // item used
2021 if (pItem->m_lootGenerated)
2023
2024 // do not allow unequipping gear except weapons, offhands, projectiles, relics in
2025 // - combat
2026 // - in-progress arenas
2027 if (!pProto->CanChangeEquipStateInCombat())
2028 {
2029 if (IsInCombat())
2031
2032 if (Battleground* bg = GetBattleground())
2033 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
2035 }
2036
2037 // Xinef: dont allow to unequip items on disarmed slot
2040
2041 if (!swap && pItem->IsNotEmptyBag())
2043
2044 return EQUIP_ERR_OK;
2045}

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanUseAttackType(), EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Item::GetSlot(), Item::GetTemplate(), IsBagPos(), IsEquipmentPos(), Unit::IsInCombat(), Item::IsNotEmptyBag(), LOG_DEBUG, Item::m_lootGenerated, sScriptMgr, and STATUS_IN_PROGRESS.

Referenced by CanEquipItem(), CanUnequipItems(), DestroyItemCount(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), and SwapItem().

◆ CanUnequipItems()

InventoryResult Player::CanUnequipItems ( uint32  item,
uint32  count 
) const
297{
298 uint32 tempcount = 0;
299
301
303 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
304 if (pItem->GetEntry() == item)
305 {
307 if (ires == EQUIP_ERR_OK)
308 {
309 tempcount += pItem->GetCount();
310 if (tempcount >= count)
311 return EQUIP_ERR_OK;
312 }
313 else
314 res = ires;
315 }
316
318 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
319 if (pItem->GetEntry() == item)
320 {
321 tempcount += pItem->GetCount();
322 if (tempcount >= count)
323 return EQUIP_ERR_OK;
324 }
325
327 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
328 if (pItem->GetEntry() == item)
329 {
330 tempcount += pItem->GetCount();
331 if (tempcount >= count)
332 return EQUIP_ERR_OK;
333 }
334
336 if (Bag* pBag = GetBagByPos(i))
337 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
338 if (Item* pItem = GetItemByPos(i, j))
339 if (pItem->GetEntry() == item)
340 {
341 tempcount += pItem->GetCount();
342 if (tempcount >= count)
343 return EQUIP_ERR_OK;
344 }
345
346 // not found req. item count and have unequippable items
347 return res;
348}
@ EQUIPMENT_SLOT_START
Definition: Player.h:674

References CanUnequipItem(), CURRENCYTOKEN_SLOT_END, EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by TakeQuestSourceItem().

◆ CanUninviteFromGroup()

PartyResult Player::CanUninviteFromGroup ( ObjectGuid  targetPlayerGUID = ObjectGuid::Empty) const
Todo:
: Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer.
12958{
12959 Group const* grp = GetGroup();
12960 if (!grp)
12961 return ERR_NOT_IN_GROUP;
12962
12963 if (grp->isLFGGroup(true))
12964 {
12965 ObjectGuid gguid = grp->GetGUID();
12966 if (!sLFGMgr->GetKicksLeft(gguid))
12968
12969 lfg::LfgState state = sLFGMgr->GetState(gguid);
12970 if (state == lfg::LFG_STATE_BOOT)
12972
12975
12978
12979 if (grp->isRollLootActive())
12981
12983 for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
12984 if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
12986
12987 if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID))
12988 {
12989 if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN))
12990 {
12991 int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration();
12992 if (static_cast<int32>(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime)
12993 {
12995 }
12996 }
12997 }
12998
12999 /* Missing support for these types
13000 return ERR_PARTY_LFG_BOOT_COOLDOWN_S;
13001 */
13002 }
13003 else
13004 {
13005 if (!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID()))
13006 return ERR_NOT_LEADER;
13007
13008 if (InBattleground())
13009 return ERR_INVITE_RESTRICTED;
13010 }
13011
13012 return ERR_PARTY_RESULT_OK;
13013}
@ CONFIG_LFG_KICK_PREVENTION_TIMER
Definition: IWorld.h:420
@ ERR_PARTY_LFG_BOOT_LOOT_ROLLS
Definition: SharedDefines.h:3732
@ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S
Definition: SharedDefines.h:3727
@ ERR_PARTY_LFG_BOOT_LIMIT
Definition: SharedDefines.h:3723
@ ERR_NOT_LEADER
Definition: SharedDefines.h:3712
@ ERR_NOT_IN_GROUP
Definition: SharedDefines.h:3711
@ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE
Definition: SharedDefines.h:3731
@ ERR_PARTY_LFG_BOOT_IN_COMBAT
Definition: SharedDefines.h:3729
@ ERR_PARTY_LFG_BOOT_IN_PROGRESS
Definition: SharedDefines.h:3725
@ ERR_INVITE_RESTRICTED
Definition: SharedDefines.h:3716
@ ERR_PARTY_RESULT_OK
Definition: SharedDefines.h:3705
@ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS
Definition: SharedDefines.h:3726
LfgState
Definition: LFG.h:70
@ LFG_STATE_FINISHED_DUNGEON
Definition: LFG.h:77
@ LFG_STATE_BOOT
Definition: LFG.h:75
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition: LFGMgr.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition: LFGMgr.h:55
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:260
bool InBattleground() const
Definition: Player.h:2228
bool isLFGGroup(bool restricted=false) const
Definition: Group.cpp:2265
bool IsAssistant(ObjectGuid guid) const
Definition: Group.cpp:2355
bool isRollLootActive() const
Definition: Group.cpp:2458
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:2341
ObjectGuid GetGUID() const
Definition: Group.cpp:2306
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References CONFIG_LFG_KICK_PREVENTION_TIMER, ERR_INVITE_RESTRICTED, ERR_NOT_IN_GROUP, ERR_NOT_LEADER, ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE, ERR_PARTY_LFG_BOOT_IN_COMBAT, ERR_PARTY_LFG_BOOT_IN_PROGRESS, ERR_PARTY_LFG_BOOT_LIMIT, ERR_PARTY_LFG_BOOT_LOOT_ROLLS, ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S, ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS, ERR_PARTY_RESULT_OK, ObjectAccessor::FindConnectedPlayer(), Group::GetFirstMember(), GetGroup(), Object::GetGUID(), Group::GetGUID(), Group::GetMembersCount(), InBattleground(), Group::IsAssistant(), Group::IsLeader(), Group::isLFGGroup(), Group::isRollLootActive(), lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_BOOT, lfg::LFG_STATE_FINISHED_DUNGEON, GroupReference::next(), sLFGMgr, and sWorld.

Referenced by WorldSession::HandleGroupUninviteGuidOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ CanUseAmmo()

InventoryResult Player::CanUseAmmo ( uint32  item) const
2478{
2479 LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item);
2480 if (!IsAlive())
2482 //if (isStunned())
2483 // return EQUIP_ERR_YOU_ARE_STUNNED;
2484 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
2485 if (pProto)
2486 {
2487 if (pProto->InventoryType != INVTYPE_AMMO)
2489
2490 InventoryResult res = CanUseItem(pProto);
2491 if (res != EQUIP_ERR_OK)
2492 return res;
2493
2494 /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation)
2495 return EQUIP_ERR_CANT_EQUIP_REPUTATION;
2496 */
2497
2498 // Requires No Ammo
2499 if (HasAura(46699))
2500 return EQUIP_ERR_BAG_FULL6;
2501
2502 return EQUIP_ERR_OK;
2503 }
2505}
@ EQUIP_ERR_YOU_ARE_DEAD
Definition: Item.h:85
@ EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE
Definition: Item.h:54
@ EQUIP_ERR_BAG_FULL6
Definition: Item.h:109
@ INVTYPE_AMMO
Definition: ItemTemplate.h:280

References CanUseItem(), EQUIP_ERR_BAG_FULL6, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE, EQUIP_ERR_YOU_ARE_DEAD, Unit::HasAura(), ItemTemplate::InventoryType, INVTYPE_AMMO, Unit::IsAlive(), LOG_DEBUG, and sObjectMgr.

Referenced by Create(), and SetAmmo().

◆ CanUseBattlegroundObject()

bool Player::CanUseBattlegroundObject ( GameObject gameobject) const
Bug:
sometimes when player clicks on flag in AB - client won't send gameobject_use, only gameobject_report_use packet Note: Mount, stealth and invisibility will be removed when used
13167{
13168 // It is possible to call this method will a nullptr pointer, only skipping faction check.
13169 if (gameobject)
13170 {
13171 FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
13172 FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
13173
13174 if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
13175 return false;
13176 }
13177
13183 return (!isTotalImmune() && // Damage immune
13184 !HasAura(SPELL_RECENTLY_DROPPED_FLAG) && // Still has recently held flag debuff
13185 IsAlive()); // Alive
13186}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
@ SPELL_RECENTLY_DROPPED_FLAG
Definition: Battleground.h:139
@ GAMEOBJECT_FACTION
Definition: UpdateFields.h:402
bool isTotalImmune() const
Definition: Player.cpp:13258
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:9976
Definition: DBCStructure.h:939
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:951

References GAMEOBJECT_FACTION, Unit::GetFactionTemplateEntry(), Object::GetUInt32Value(), Unit::HasAura(), Unit::IsAlive(), FactionTemplateEntry::IsFriendlyTo(), isTotalImmune(), sFactionTemplateStore, and SPELL_RECENTLY_DROPPED_FLAG.

Referenced by Spell::CheckCast(), and GameObject::Use().

◆ CanUseItem() [1/2]

InventoryResult Player::CanUseItem ( Item pItem,
bool  not_loading = true 
) const
Todo:
: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY.
2235{
2236 if (pItem)
2237 {
2238 LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = {}", pItem->GetEntry());
2239
2240 if (!IsAlive() && not_loading)
2242
2243 //if (isStunned())
2244 // return EQUIP_ERR_YOU_ARE_STUNNED;
2245
2246 ItemTemplate const* pProto = pItem->GetTemplate();
2247 if (pProto)
2248 {
2249 if (pItem->IsBindedNotWith(this))
2251
2252 InventoryResult res = CanUseItem(pProto);
2253 if (res != EQUIP_ERR_OK)
2254 return res;
2255
2256 if (pItem->GetSkill() != 0)
2257 {
2258 bool allowEquip = false;
2259 uint32 itemSkill = pItem->GetSkill();
2260 // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet.
2261 if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill))
2262 {
2264
2265 // In fact it's a visual bug, everything works properly... I need sniffs of operations with
2266 // binded to account items from off server.
2267
2269 {
2270 allowEquip = (itemSkill == SKILL_PLATE_MAIL);
2271 }
2273 {
2274 allowEquip = (itemSkill == SKILL_MAIL);
2275 }
2276 }
2277 if (!allowEquip && GetSkillValue(itemSkill) == 0)
2279 }
2280
2283
2284 return EQUIP_ERR_OK;
2285 }
2286 }
2288}
@ EQUIP_ERR_CANT_EQUIP_REPUTATION
Definition: Item.h:111
@ ITEM_QUALITY_HEIRLOOM
Definition: SharedDefines.h:336
@ SKILL_PLATE_MAIL
Definition: SharedDefines.h:2951
@ SKILL_MAIL
Definition: SharedDefines.h:2962
uint32 GetSkill()
Definition: Item.cpp:556
uint32 Quality
Definition: ItemTemplate.h:626

References CanUseItem(), ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_HUNTER, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARRIOR, EQUIP_ERR_CANT_EQUIP_REPUTATION, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, Object::GetEntry(), GetReputationRank(), Item::GetSkill(), GetSkillValue(), Item::GetTemplate(), HasSkill(), Unit::IsAlive(), Item::IsBindedNotWith(), IsClass(), ITEM_CLASS_ARMOR, ITEM_QUALITY_HEIRLOOM, LOG_DEBUG, ItemTemplate::Quality, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, SKILL_MAIL, and SKILL_PLATE_MAIL.

Referenced by AuctionHouseObject::BuildListAuctionItems(), CanBankItem(), CanEquipItem(), CanUseAmmo(), CanUseItem(), WorldSession::HandleReadItem(), and WorldSession::HandleUseItemOpcode().

◆ CanUseItem() [2/2]

InventoryResult Player::CanUseItem ( ItemTemplate const *  pItem) const
2291{
2292 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2293
2294 if (!proto)
2295 {
2297 }
2298
2299 if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE)
2300 {
2302 }
2303
2304 if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE)
2305 {
2307 }
2308
2309 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2310 {
2312 }
2313
2314 if (proto->RequiredSkill != 0)
2315 {
2316 if (GetSkillValue(proto->RequiredSkill) == 0)
2317 {
2319 }
2320 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2321 {
2323 }
2324 }
2325
2326 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2327 {
2329 }
2330
2331 if (GetLevel() < proto->RequiredLevel)
2332 {
2334 }
2335
2336 // If World Event is not active, prevent using event dependant items
2337 if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
2338 {
2340 }
2341
2343
2344 if (!sScriptMgr->CanUseItem(const_cast<Player*>(this), proto, result))
2345 {
2346 return result;
2347 }
2348
2349 return EQUIP_ERR_OK;
2350}
@ EQUIP_ERR_CANT_EQUIP_LEVEL_I
Definition: Item.h:48
bool IsHolidayActive(HolidayIds id)
Definition: GameEventMgr.cpp:1910
HolidayIds
Definition: SharedDefines.h:2741

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Unit::GetLevel(), Unit::getRaceMask(), GetSkillValue(), GetTeamId(), ItemTemplate::HasFlag2(), HasSpell(), ItemTemplate::HolidayId, IsHolidayActive(), ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::RequiredLevel, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, sScriptMgr, TEAM_ALLIANCE, and TEAM_HORDE.

◆ CastItemCombatSpell() [1/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx 
)
7156{
7157 if (!target || !target->IsAlive() || target == this)
7158 return;
7159
7160 // Xinef: do not use disarmed weapons, special exception - shaman ghost wolf form
7161 // Xinef: normal forms proc on hit enchants / built in item bonuses
7163 return;
7164
7166 {
7167 // If usable, try to cast item spell
7168 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
7169 if (!item->IsBroken())
7170 if (ItemTemplate const* proto = item->GetTemplate())
7171 {
7172 // Additional check for weapons
7173 if (proto->Class == ITEM_CLASS_WEAPON)
7174 {
7175 // offhand item cannot proc from main hand hit etc
7176 EquipmentSlots slot;
7177 switch (attType)
7178 {
7179 case BASE_ATTACK:
7181 break;
7182 case OFF_ATTACK:
7184 break;
7185 case RANGED_ATTACK:
7186 slot = EQUIPMENT_SLOT_RANGED;
7187 break;
7188 default:
7189 slot = EQUIPMENT_SLOT_END;
7190 break;
7191 }
7192 if (slot != i)
7193 continue;
7194 }
7195
7196 CastItemCombatSpell(target, attType, procVictim, procEx, item, proto);
7197 }
7198 }
7199}
EquipmentSlots
Definition: Player.h:673
@ FORM_GHOSTWOLF
Definition: UnitDefines.h:85
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7155

References BASE_ATTACK, Unit::CanUseAttackType(), CastItemCombatSpell(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, FORM_GHOSTWOLF, GetItemByPos(), Unit::GetShapeshiftForm(), INVENTORY_SLOT_BAG_0, Unit::IsAlive(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by CastItemCombatSpell(), Unit::DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ CastItemCombatSpell() [2/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx,
Item item,
ItemTemplate const *  proto 
)
7202{
7203 if (!sScriptMgr->CanCastItemCombatSpell(this, target, attType, procVictim, procEx, item, proto))
7204 return;
7205
7206 // Can do effect if any damage done to target
7207 if (procVictim & PROC_FLAG_TAKEN_DAMAGE)
7208 //if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE)
7209 {
7210 for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
7211 {
7212 _Spell const& spellData = proto->Spells[i];
7213
7214 // no spell
7215 if (!spellData.SpellId)
7216 continue;
7217
7218 // wrong triggering type
7220 continue;
7221
7222 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7223 if (!spellInfo)
7224 {
7225 LOG_ERROR("entities.player", "WORLD: unknown Item spellid {}", spellData.SpellId);
7226 continue;
7227 }
7228
7229 float chance = (float)spellInfo->ProcChance;
7230
7231 if (spellData.SpellPPMRate)
7232 {
7233 uint32 WeaponSpeed = GetAttackTime(attType);
7234 chance = GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);
7235 }
7236 else if (chance > 100.0f)
7237 {
7238 chance = GetWeaponProcChance();
7239 }
7240
7241 if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, target, spellInfo, item))
7243 }
7244 }
7245
7246 // item combat enchantments
7247 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7248 {
7249 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7250 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7251 if (!pEnchant)
7252 continue;
7253
7254 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7255 {
7256 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
7257 continue;
7258
7259 SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);
7260
7261 if (entry && entry->procEx)
7262 {
7263 // Check hit/crit/dodge/parry requirement
7264 if ((entry->procEx & procEx) == 0)
7265 continue;
7266 }
7267 else
7268 {
7269 // Can do effect if any damage done to target
7270 if (!(procVictim & PROC_FLAG_TAKEN_DAMAGE))
7271 //if (!(damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE))
7272 continue;
7273 }
7274
7275 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_WHITE_HIT) && (procVictim & SPELL_PROC_FLAG_MASK))
7276 continue;
7277
7278 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7279 if (!spellInfo)
7280 {
7281 LOG_ERROR("entities.player", "Player::CastItemCombatSpell({}, name: {}, enchant: {}): unknown spell {} is casted, ignoring...",
7282 GetGUID().ToString(), GetName(), pEnchant->ID, pEnchant->spellid[s]);
7283 continue;
7284 }
7285
7286 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0)
7287 {
7288 Unit* checkTarget = spellInfo->IsPositive() ? this : target;
7289 if (checkTarget->HasAura(spellInfo->Id, GetGUID()))
7290 {
7291 continue;
7292 }
7293 }
7294
7295 float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
7296
7297 if (entry)
7298 {
7299 if (entry->PPMChance)
7300 chance = GetPPMProcChance(proto->Delay, entry->PPMChance, spellInfo);
7301 else if (entry->customChance)
7302 chance = (float)entry->customChance;
7303 }
7304
7305 // Apply spell mods
7306 ApplySpellMod(pEnchant->spellid[s], SPELLMOD_CHANCE_OF_SUCCESS, chance);
7307
7308 // Shiv has 100% chance to apply the poison
7309 if (FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)
7310 chance = 100.0f;
7311
7312 if (roll_chance_f(chance))
7313 {
7314 // Xinef: implement enchant charges
7315 if (uint32 charges = item->GetEnchantmentCharges(EnchantmentSlot(e_slot)))
7316 {
7317 if (!--charges)
7318 {
7319 ApplyEnchantment(item, EnchantmentSlot(e_slot), false);
7320 item->ClearEnchantment(EnchantmentSlot(e_slot));
7321 }
7322 else
7323 item->SetEnchantmentCharges(EnchantmentSlot(e_slot), charges);
7324 }
7325
7326 Unit* unitTarget = spellInfo->IsPositive() ? this : target;
7328 }
7329 }
7330 }
7331}
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ SPELL_PROC_FLAG_MASK
Definition: SpellMgr.h:156
@ ENCHANT_PROC_ATTR_WHITE_HIT
Definition: SpellMgr.h:310
@ ENCHANT_PROC_ATTR_EXCLUSIVE
Definition: SpellMgr.h:309
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:95
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
Definition: SpellDefines.h:133
@ ITEM_SPELLTRIGGER_CHANCE_ON_HIT
Definition: ItemTemplate.h:79
bool roll_chance_f(float chance)
Definition: Random.h:53
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
Definition: Item.cpp:952
void ClearEnchantment(EnchantmentSlot slot)
Definition: Item.cpp:961
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition: Item.h:306
float SpellPPMRate
Definition: ItemTemplate.h:594
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13386
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4109
float GetWeaponProcChance() const
Definition: Unit.cpp:13375
bool IsPositive() const
Definition: SpellInfo.cpp:1236
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:314
uint32 procEx
Definition: SpellMgr.h:317
uint32 attributeMask
Definition: SpellMgr.h:318
uint32 customChance
Definition: SpellMgr.h:315
float PPMChance
Definition: SpellMgr.h:316
uint32 ID
Definition: DBCStructure.h:1842

References SpellItemEnchantmentEntry::amount, ApplyEnchantment(), ApplySpellMod(), SpellEnchantProcEntry::attributeMask, Unit::CastSpell(), Item::ClearEnchantment(), SpellEnchantProcEntry::customChance, ItemTemplate::Delay, ENCHANT_PROC_ATTR_EXCLUSIVE, ENCHANT_PROC_ATTR_WHITE_HIT, Unit::FindCurrentSpellBySpellId(), Unit::GetAttackTime(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Object::GetGUID(), WorldObject::GetName(), Unit::GetPPMProcChance(), Unit::GetWeaponProcChance(), Unit::HasAura(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, SpellInfo::IsPositive(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_SPELLTRIGGER_CHANCE_ON_HIT, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, SpellEnchantProcEntry::PPMChance, PROC_FLAG_TAKEN_DAMAGE, SpellInfo::ProcChance, SpellEnchantProcEntry::procEx, roll_chance_f(), Item::SetEnchantmentCharges(), SPELL_PROC_FLAG_MASK, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, SPELLMOD_CHANCE_OF_SUCCESS, _Spell::SpellPPMRate, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Position::ToString(), TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD, and SpellItemEnchantmentEntry::type.

◆ CastItemUseSpell()

void Player::CastItemUseSpell ( Item item,
SpellCastTargets const &  targets,
uint8  cast_count,
uint32  glyphIndex 
)
7334{
7335 if (!sScriptMgr->CanCastItemUseSpell(this, item, targets, cast_count, glyphIndex))
7336 return;
7337
7338 ItemTemplate const* proto = item->GetTemplate();
7339 // special learning case
7340 if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)
7341 {
7342 uint32 learn_spell_id = proto->Spells[0].SpellId;
7343 uint32 learning_spell_id = proto->Spells[1].SpellId;
7344
7345 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
7346 if (!spellInfo)
7347 {
7348 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring ", proto->ItemId, learn_spell_id);
7349 SendEquipError(EQUIP_ERR_NONE, item, nullptr);
7350 return;
7351 }
7352
7353 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
7354 spell->m_CastItem = item;
7355 spell->m_cast_count = cast_count; //set count of casts
7356 spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
7357 spell->prepare(&targets);
7358 return;
7359 }
7360
7361 // use triggered flag only for items with many spell casts and for not first cast
7362 uint8 count = 0;
7363
7364 std::list<Spell*> pushSpells;
7365 // item spells casted at use
7366 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7367 {
7368 _Spell const& spellData = proto->Spells[i];
7369
7370 // no spell
7371 if (!spellData.SpellId)
7372 continue;
7373
7374 // wrong triggering type
7375 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
7376 continue;
7377
7378 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7379 if (!spellInfo)
7380 {
7381 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring", proto->ItemId, spellData.SpellId);
7382 continue;
7383 }
7384
7385 if (HasSpellCooldown(spellInfo->Id))
7386 {
7387 continue;
7388 }
7389
7390 if (!spellInfo->CheckElixirStacking(this))
7391 {
7392 Spell::SendCastResult(this, spellInfo, cast_count, SPELL_FAILED_AURA_BOUNCED);
7393 continue;
7394 }
7395
7396 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7397 spell->m_CastItem = item;
7398 spell->m_cast_count = cast_count; // set count of casts
7399 spell->m_glyphIndex = glyphIndex; // glyph index
7400 spell->InitExplicitTargets(targets);
7401
7402 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7403 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7404 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7405 SpellCastResult result = spell->CheckCast(true);
7406 if (result != SPELL_CAST_OK)
7407 {
7408 spell->SendCastResult(result);
7409 delete spell;
7410 continue;
7411 }
7412
7413 pushSpells.push_back(spell);
7414 //spell->prepare(&targets);
7415
7416 ++count;
7417 }
7418
7419 // Item enchantments spells casted at use
7420 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7421 {
7422 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7423 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7424 if (!pEnchant)
7425 continue;
7426 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7427 {
7428 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)
7429 continue;
7430
7431 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7432 if (!spellInfo)
7433 {
7434 LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant {}, cast unknown spell {}", pEnchant->ID, pEnchant->spellid[s]);
7435 continue;
7436 }
7437
7438 if (HasSpellCooldown(spellInfo->Id))
7439 continue;
7440
7441 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7442 spell->m_CastItem = item;
7443 spell->m_cast_count = cast_count; // set count of casts
7444 spell->m_glyphIndex = glyphIndex; // glyph index
7445 spell->InitExplicitTargets(targets);
7446
7447 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7448 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7449 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7450 SpellCastResult result = spell->CheckCast(true);
7451 if (result != SPELL_CAST_OK)
7452 {
7453 spell->SendCastResult(result);
7454 delete spell;
7455 continue;
7456 }
7457
7458 pushSpells.push_back(spell);
7459 //spell->prepare(&targets);
7460
7461 ++count;
7462 }
7463 }
7464
7465 // xinef: send all spells in one go, prevents crash because container is not set
7466 for (std::list<Spell*>::const_iterator itr = pushSpells.begin(); itr != pushSpells.end(); ++itr)
7467 (*itr)->prepare(&targets);
7468}
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:114
@ TRIGGERED_NONE
Definition: SpellDefines.h:131
@ EQUIP_ERR_NONE
Definition: Item.h:106
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_FAILED_AURA_BOUNCED
Definition: SharedDefines.h:958
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16282
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3467
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8422
uint8 m_cast_count
Definition: Spell.h:524
uint32 m_glyphIndex
Definition: Spell.h:525
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5643
void InitExplicitTargets(SpellCastTargets const &targets)
Definition: Spell.cpp:713
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4659
Item * m_CastItem
Definition: Spell.h:521
bool CheckElixirStacking(Unit const *caster) const
Definition: SpellInfo.cpp:2889

References Spell::CheckCast(), SpellInfo::CheckElixirStacking(), EQUIP_ERR_NONE, Item::GetEnchantmentId(), Item::GetTemplate(), HasSpellCooldown(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, Spell::InitExplicitTargets(), ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, LOG_ERROR, Spell::m_cast_count, Spell::m_CastItem, Spell::m_glyphIndex, MAX_ENCHANTMENT_SLOT, MAX_ITEM_PROTO_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, Spell::prepare(), Spell::SendCastResult(), SendEquipError(), Spell::SetSpellValue(), SPELL_CAST_OK, SPELL_FAILED_AURA_BOUNCED, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, ItemTemplate::Spells, _Spell::SpellTrigger, SPELLVALUE_BASE_POINT0, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TRIGGERED_FULL_MASK, TRIGGERED_NONE, and SpellItemEnchantmentEntry::type.

Referenced by WorldSession::HandleUseItemOpcode().

◆ CharmSpellInitialize()

void Player::CharmSpellInitialize ( )
9600{
9601 Unit* charm = GetFirstControlled();
9602 if (!charm)
9603 return;
9604
9605 CharmInfo* charmInfo = charm->GetCharmInfo();
9606 if (!charmInfo)
9607 {
9608 LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm ({}) has no charminfo!", charm->GetGUID().ToString());
9609 return;
9610 }
9611
9612 uint8 addlist = 0;
9613 if (charm->GetTypeId() != TYPEID_PLAYER)
9614 {
9615 //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate();
9616 //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)
9617 {
9618 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9619 if (charmInfo->GetCharmSpell(i)->GetAction())
9620 ++addlist;
9621 }
9622 }
9623
9624 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 4 * addlist + 1);
9625 data << charm->GetGUID();
9626 data << uint16(0);
9627 data << uint32(0);
9628
9629 if (charm->GetTypeId() != TYPEID_PLAYER)
9630 data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
9631 else
9632 data << uint32(0);
9633
9634 charmInfo->BuildActionBar(&data);
9635
9636 data << uint8(addlist);
9637
9638 if (addlist)
9639 {
9640 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9641 {
9642 CharmSpellInfo* cspell = charmInfo->GetCharmSpell(i);
9643 if (cspell->GetAction())
9644 data << uint32(cspell->packedData);
9645 }
9646 }
9647
9648 data << uint8(0); // cooldowns count
9649
9650 GetSession()->SendPacket(&data);
9651}
#define MAX_SPELL_CHARM
Definition: CharmInfo.h:23
#define MAX_UNIT_ACTION_BAR_INDEX
Definition: CharmInfo.h:28
@ SMSG_PET_SPELLS
Definition: Opcodes.h:407
ReactStates GetReactState() const
Definition: Creature.h:98
Definition: CharmInfo.h:93
uint32 packedData
Definition: CharmInfo.h:96
uint32 GetAction() const
Definition: CharmInfo.h:100
Definition: CharmInfo.h:125
CharmSpellInfo * GetCharmSpell(uint8 index)
Definition: CharmInfo.h:156
CommandStates GetCommandState() const
Definition: CharmInfo.h:134
void BuildActionBar(WorldPacket *data)
Definition: CharmInfo.cpp:292
CharmInfo * GetCharmInfo()
Definition: Unit.h:1226
Unit * GetFirstControlled() const
Definition: Unit.cpp:11010

References CharmInfo::BuildActionBar(), UnitActionBarEntry::GetAction(), Unit::GetCharmInfo(), CharmInfo::GetCharmSpell(), CharmInfo::GetCommandState(), Unit::GetFirstControlled(), Object::GetGUID(), Creature::GetReactState(), GetSession(), Object::GetTypeId(), LOG_ERROR, MAX_SPELL_CHARM, MAX_UNIT_ACTION_BAR_INDEX, UnitActionBarEntry::packedData, WorldSession::SendPacket(), SMSG_PET_SPELLS, Object::ToCreature(), ObjectGuid::ToString(), and TYPEID_PLAYER.

Referenced by spell_mage_summon_water_elemental::HandleDummy(), WorldSession::HandleRequestPetInfo(), Unit::SetCharmedBy(), and Unit::SetMinion().

◆ CheckAllAchievementCriteria()

void Player::CheckAllAchievementCriteria ( )
13849{
13851}
void CheckAllAchievementCriteria()
Definition: AchievementMgr.cpp:773

References AchievementMgr::CheckAllAchievementCriteria(), and m_achievementMgr.

Referenced by Create(), and WorldSession::HandlePlayerLoginFromDB().

◆ CheckAmmoCompatibility()

bool Player::CheckAmmoCompatibility ( ItemTemplate const *  ammo_proto) const
7612{
7613 if (!ammo_proto)
7614 return false;
7615
7616 // check ranged weapon
7618 if (!weapon || weapon->IsBroken())
7619 return false;
7620
7621 ItemTemplate const* weapon_proto = weapon->GetTemplate();
7622 if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON)
7623 return false;
7624
7625 // check ammo ws. weapon compatibility
7626 switch (weapon_proto->SubClass)
7627 {
7630 if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW)
7631 return false;
7632 break;
7634 if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET)
7635 return false;
7636 break;
7637 default:
7638 return false;
7639 }
7640
7641 return true;
7642}
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
Definition: ItemTemplate.h:362
@ ITEM_SUBCLASS_WEAPON_GUN
Definition: ItemTemplate.h:347
@ ITEM_SUBCLASS_WEAPON_BOW
Definition: ItemTemplate.h:346
@ ITEM_SUBCLASS_ARROW
Definition: ItemTemplate.h:416
@ ITEM_SUBCLASS_BULLET
Definition: ItemTemplate.h:417
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:511

References ItemTemplate::Class, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), ITEM_CLASS_WEAPON, ITEM_SUBCLASS_ARROW, ITEM_SUBCLASS_BULLET, ITEM_SUBCLASS_WEAPON_BOW, ITEM_SUBCLASS_WEAPON_CROSSBOW, ITEM_SUBCLASS_WEAPON_GUN, RANGED_ATTACK, and ItemTemplate::SubClass.

Referenced by _ApplyAmmoBonuses().

◆ CheckAreaExploreAndOutdoor()

void Player::CheckAreaExploreAndOutdoor ( )
5672{
5673 if (!IsAlive())
5674 return;
5675
5676 if (IsInFlight())
5677 return;
5678
5679 bool isOutdoor = IsOutdoors();
5680 uint32 areaId = GetAreaId();
5681 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
5682
5683 if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor)
5684 {
5685 _wasOutdoor = isOutdoor;
5686
5688 SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS;
5689 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5690 {
5691 Aura* aura = iter->second->GetBase();
5692 SpellInfo const* spell = aura->GetSpellInfo();
5693 if (spell->Attributes & attrToRemove)
5694 {
5695 // if passive - do not remove and just turn off all effects
5696 if (aura->IsPassive())
5697 {
5698 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false);
5699 ++iter;
5700 continue;
5701 }
5702
5703 RemoveAura(iter);
5704 }
5705 else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive())
5706 {
5707 // if passive - turn on all effects
5708 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true);
5709 ++iter;
5710 }
5711 else
5712 {
5713 ++iter;
5714 }
5715 }
5716 }
5717
5718 if (!sScriptMgr->CanAreaExploreAndOutdoor(this))
5719 return;
5720
5721 if (!areaId)
5722 return;
5723
5724 if (!areaEntry)
5725 {
5726 LOG_ERROR("entities.player", "Player '{}' ({}) discovered unknown area (x: {} y: {} z: {} map: {})",
5728 return;
5729 }
5730
5731 uint32 offset = areaEntry->exploreFlag / 32;
5732
5733 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
5734 {
5735 LOG_ERROR("entities.player", "Wrong area flag {} in map data for (X: {} Y: {}) point to field PLAYER_EXPLORED_ZONES_1 + {} ( {} must be < {} ).", areaEntry->flags, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE);
5736 return;
5737 }
5738
5739 uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32));
5740 uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
5741
5742 if (!(currFields & val))
5743 {
5744 SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
5745
5747
5748 if (areaEntry->area_level > 0)
5749 {
5750 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
5751 {
5752 SendExplorationExperience(areaId, 0);
5753 }
5754 else
5755 {
5756 int32 diff = int32(GetLevel()) - areaEntry->area_level;
5757 uint32 XP = 0;
5758 if (diff < -5)
5759 {
5760 XP = uint32(sObjectMgr->GetBaseXP(GetLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE));
5761 }
5762 else if (diff > 5)
5763 {
5764 int32 exploration_percent = (100 - ((diff - 5) * 5));
5765 if (exploration_percent > 100)
5766 exploration_percent = 100;
5767 else if (exploration_percent < 0)
5768 exploration_percent = 0;
5769
5770 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE));
5771 }
5772 else
5773 {
5774 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE));
5775 }
5776
5777 sScriptMgr->OnGivePlayerXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE);
5778 GiveXP(XP, nullptr);
5779 SendExplorationExperience(areaId, XP);
5780 }
5781 LOG_DEBUG("entities.player", "Player {} discovered a new area: {}", GetGUID().ToString(), areaId);
5782 }
5783 }
5784}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:240
@ CONFIG_VMAP_INDOOR_CHECK
Definition: IWorld.h:128
@ RATE_XP_EXPLORE
Definition: IWorld.h:478
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition: DBCEnums.h:157
@ SPELL_ATTR0_ONLY_INDOORS
Definition: SharedDefines.h:396
@ SPELL_ATTR0_ONLY_OUTDOORS
Definition: SharedDefines.h:397
bool IsOutdoors() const
Definition: Object.cpp:3166
void SendExplorationExperience(uint32 Area, uint32 Experience)
Definition: PlayerMisc.cpp:159
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition: Player.cpp:2370
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4738
bool IsInFlight() const
Definition: Unit.h:1020
AuraApplicationMap m_appliedAuras
Definition: Unit.h:1847
void HandleAllEffects(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuras.cpp:1241
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Attributes
Definition: SpellInfo.h:324
Definition: DBCStructure.h:519
int32 area_level
Definition: DBCStructure.h:526
uint32 flags
Definition: DBCStructure.h:524
uint32 exploreFlag
Definition: DBCStructure.h:523

References _wasOutdoor, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, AreaTableEntry::area_level, SpellInfo::Attributes, AURA_EFFECT_HANDLE_REAL, CONFIG_MAX_PLAYER_LEVEL, CONFIG_VMAP_INDOOR_CHECK, AreaTableEntry::exploreFlag, AreaTableEntry::flags, WorldObject::GetAreaId(), Object::GetGUID(), Unit::GetLevel(), WorldLocation::GetMapId(), WorldObject::GetName(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Aura::GetSpellInfo(), Object::GetUInt32Value(), GiveXP(), Aura::HandleAllEffects(), Unit::IsAlive(), Unit::IsInFlight(), WorldObject::IsOutdoors(), Aura::IsPassive(), LOG_DEBUG, LOG_ERROR, Unit::m_appliedAuras, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, RATE_XP_EXPLORE, Unit::RemoveAura(), sAreaTableStore, SendExplorationExperience(), Unit::SetUInt32Value(), sObjectMgr, SPELL_ATTR0_ONLY_INDOORS, SPELL_ATTR0_ONLY_OUTDOORS, sScriptMgr, sWorld, Position::ToString(), and UpdateAchievementCriteria().

Referenced by UpdatePosition().

◆ CheckDuelDistance()

void Player::CheckDuelDistance ( time_t  currTime)
6326{
6327 if (!duel)
6328 {
6329 return;
6330 }
6331
6333 GameObject* obj = GetMap()->GetGameObject(duelFlagGUID);
6334 if (!obj)
6335 return;
6336
6337 if (!duel->OutOfBoundsTime)
6338 {
6339 if (!IsWithinDistInMap(obj, 50))
6340 {
6341 duel->OutOfBoundsTime = currTime + 10;
6342
6344 GetSession()->SendPacket(&data);
6345 }
6346 }
6347 else
6348 {
6349 if (IsWithinDistInMap(obj, 40))
6350 {
6351 duel->OutOfBoundsTime = 0;
6352
6354 GetSession()->SendPacket(&data);
6355 }
6356 else if (currTime >= duel->OutOfBoundsTime)
6358 }
6359}
@ PLAYER_DUEL_ARBITER
Definition: UpdateFields.h:177
@ DUEL_FLED
Definition: SharedDefines.h:3614
@ SMSG_DUEL_INBOUNDS
Definition: Opcodes.h:391
@ SMSG_DUEL_OUTOFBOUNDS
Definition: Opcodes.h:390
Definition: GameObject.h:121
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6366
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1854
GameObject * GetGameObject(ObjectGuid const guid)
Definition: Map.cpp:3319

References duel, DUEL_FLED, DuelComplete(), Map::GetGameObject(), Object::GetGuidValue(), WorldObject::GetMap(), GetSession(), WorldObject::IsWithinDistInMap(), PLAYER_DUEL_ARBITER, WorldSession::SendPacket(), SMSG_DUEL_INBOUNDS, and SMSG_DUEL_OUTOFBOUNDS.

Referenced by Update().

◆ CheckInstanceCount()

bool Player::CheckInstanceCount ( uint32  instanceId) const
6996{
6997 if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR))
6998 return true;
6999 return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end();
7000}
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition: IWorld.h:367

References _instanceResetTimes, CONFIG_MAX_INSTANCES_PER_HOUR, and sWorld.

Referenced by MapMgr::PlayerCannotEnter().

◆ CheckInstanceLoginValid()

bool Player::CheckInstanceLoginValid ( )
6967{
6968 if (!GetMap())
6969 return false;
6970
6971 if (!GetMap()->IsDungeon() || IsGameMaster())
6972 return true;
6973
6974 if (GetMap()->IsRaid())
6975 {
6976 // cannot be in raid instance without a group
6977 if (!GetGroup() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
6978 return false;
6979 }
6980 else
6981 {
6982 // cannot be in normal instance without a group and more players than 1 in instance
6983 if (!GetGroup() && GetMap()->GetPlayersCountExceptGMs() > 1)
6984 return false;
6985 }
6986
6987 // pussywizard: check CanEnter for GetMap(), because in PlayerCannotEnter it is called for a map decided before loading screen (can change)
6988 if (GetMap()->CannotEnter(this, true))
6989 return false;
6990
6991 // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player
6992 return sMapMgr->PlayerCannotEnter(GetMap()->GetId(), this, true) == Map::CAN_ENTER;
6993}
#define sMapMgr
Definition: MapMgr.h:221
@ CONFIG_INSTANCE_IGNORE_RAID
Definition: IWorld.h:90
uint32 GetId(std::string const &username)
Definition: AccountMgr.cpp:229
@ CAN_ENTER
Definition: Map.h:424

References Map::CAN_ENTER, CONFIG_INSTANCE_IGNORE_RAID, GetGroup(), WorldObject::GetMap(), IsGameMaster(), sMapMgr, and sWorld.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ CleanupAfterTaxiFlight()

void Player::CleanupAfterTaxiFlight ( )
10384{
10385 // For spells that trigger flying paths remove them at arrival
10387 {
10390 }
10391 m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
10392 Dismount();
10395}
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:249
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
void Dismount()
Definition: Unit.cpp:13459
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:1492

References PlayerTaxi::ClearTaxiDestinations(), Unit::Dismount(), Unit::getHostileRefMgr(), m_flightSpellActivated, m_taxi, Unit::RemoveAurasDueToSpell(), Unit::RemoveUnitFlag(), HostileRefMgr::setOnlineOfflineState(), UNIT_FLAG_DISABLE_MOVE, and UNIT_FLAG_TAXI_FLIGHT.

Referenced by go_commandscript::DoTeleport(), misc_commandscript::HandleAppearCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), and TeleportTo().

◆ CleanupChannels()

void Player::CleanupChannels ( )
4946{
4947 while (!m_channels.empty())
4948 {
4949 Channel* ch = *m_channels.begin();
4950 m_channels.erase(m_channels.begin()); // remove from player's channel list
4951 ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
4952 }
4953}
Definition: Channel.h:148
void LeaveChannel(Player *player, bool send=true)
Definition: Channel.cpp:252
JoinedChannelsList m_channels
Definition: Player.h:2811

References Channel::LeaveChannel(), and m_channels.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), and WorldSession::LogoutPlayer().

◆ CleanupsBeforeDelete()

void Player::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

460{
461 TradeCancel(false);
463
464 Unit::CleanupsBeforeDelete(finalCleanup);
465}
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3612
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition: Unit.cpp:15699

References Unit::CleanupsBeforeDelete(), DUEL_INTERRUPTED, DuelComplete(), and TradeCancel().

Referenced by WorldSession::LogoutPlayer().

◆ ClearAfkReports()

void Player::ClearAfkReports ( )
inline
2260{ m_bgData.bgAfkReporter.clear(); }
GuidSet bgAfkReporter
Definition: Player.h:1041

References BGData::bgAfkReporter, and m_bgData.

Referenced by Battleground::RemovePlayerAtLeave().

◆ ClearChannelWatch()

void Player::ClearChannelWatch ( )
4956{
4957 for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr)
4958 (*itr)->RemoveWatching(this);
4959}

References m_channels.

Referenced by WorldSession::HandleSetChannelWatch().

◆ ClearReceivedSpectatorResetFor()

void Player::ClearReceivedSpectatorResetFor ( )
inline

◆ clearResurrectRequestData()

void Player::clearResurrectRequestData ( )
inline
1802{ setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
Definition: Player.h:1792

References ObjectGuid::Empty, and setResurrectRequestData().

Referenced by WorldSession::HandleResurrectResponseOpcode(), Player(), and setDeathState().

◆ ClearWhisperWhiteList()

void Player::ClearWhisperWhiteList ( )
inline
2534{ WhisperList.clear(); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ CompletedAchievement()

void Player::CompletedAchievement ( AchievementEntry const *  entry)
13884{
13886}
void CompletedAchievement(AchievementEntry const *entry)
Definition: AchievementMgr.cpp:2227

References AchievementMgr::CompletedAchievement(), and m_achievementMgr.

Referenced by achievement_commandscript::HandleAchievementAddCommand().

◆ CompleteQuest()

void Player::CompleteQuest ( uint32  quest_id)
598{
599 if (!quest_id)
600 {
601 return;
602 }
603
604 if (!sScriptMgr->OnBeforePlayerQuestComplete(this, quest_id))
605 {
606 return;
607 }
608
610
611 auto log_slot = FindQuestSlot(quest_id);
612 if (log_slot < MAX_QUEST_LOG_SIZE)
613 {
615 }
616
617 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
618 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_TRACKING))
619 {
620 RewardQuest(qInfo, 0, this, false);
621 }
622
623 // Xinef: area auras may change on quest completion!
627
628 // check if Quest Tracker is enabled
629 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
630 {
631 // prepare Quest Tracker datas
632 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME);
633 stmt->SetData(0, quest_id);
634 stmt->SetData(1, GetGUID().GetCounter());
635
636 // add to Quest Tracker
637 CharacterDatabase.Execute(stmt);
638 }
639}
@ QUEST_FLAGS_TRACKING
Definition: QuestDef.h:142
@ ADDITIONAL_SAVING_INVENTORY_AND_GOLD
Definition: Player.h:991
@ CHAR_UPD_QUEST_TRACK_COMPLETE_TIME
Definition: CharacterDatabase.h:500
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition: PlayerQuest.cpp:658
void SetQuestStatus(uint32 questId, QuestStatus status, bool update=true)
Definition: PlayerQuest.cpp:1473

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, FindQuestSlot(), WorldObject::GetAreaId(), Object::GetGUID(), WorldObject::GetZoneId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_TRACKING, QUEST_STATE_COMPLETE, QUEST_STATUS_COMPLETE, RewardQuest(), SetQuestSlotState(), SetQuestStatus(), sObjectMgr, sScriptMgr, sWorld, UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), Spell::EffectQuestComplete(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_plucky::OnGossipSelect(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), TalkedToCreature(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached().

◆ ContinueTaxiFlight()

void Player::ContinueTaxiFlight ( )
10398{
10399 uint32 sourceNode = m_taxi.GetTaxiSource();
10400 if (!sourceNode)
10401 return;
10402
10403 LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString());
10404
10405 uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true);
10406 if (!mountDisplayId)
10407 return;
10408
10410
10411 // search appropriate start path node
10412 uint32 startNode = 0;
10413
10414 TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path];
10415
10416 float bestDist = SIZE_OF_GRIDS * SIZE_OF_GRIDS; // xinef: large value
10417 float currDist = 0.0f;
10418
10419 // xinef: changed to -1, we dont want to catch last node
10420 for (uint32 i = 0; i < nodeList.size() - 1; ++i)
10421 {
10422 TaxiPathNodeEntry const* node = nodeList[i];
10423 TaxiPathNodeEntry const* nextNode = nodeList[i + 1];
10424
10425 // xinef: skip nodes at another map, get last valid node on current map
10426 if (nextNode->mapid != GetMapId() || node->mapid != GetMapId())
10427 continue;
10428
10429 currDist = (node->x - GetPositionX()) * (node->x - GetPositionX()) + (node->y - GetPositionY()) * (node->y - GetPositionY()) + (node->z - GetPositionZ()) * (node->z - GetPositionZ());
10430 if (currDist < bestDist)
10431 {
10432 startNode = i;
10433 bestDist = currDist;
10434 }
10435 }
10436
10437 // xinef: no proper node was found
10438 if (startNode == 0)
10439 {
10441 return;
10442 }
10443
10445 {
10447 }
10448
10449 if (IsMounted())
10450 {
10452 }
10453
10454 SetCanTeleport(true);
10455
10456 GetSession()->SendDoFlight(mountDisplayId, path, startNode);
10457}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition: DBCStores.cpp:187
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition: DBCStructure.h:2245
#define SIZE_OF_GRIDS
Definition: MapDefines.h:25
void SetCanTeleport(bool value)
Definition: Player.h:2474
uint32 GetTaxiSource() const
Definition: PlayerTaxi.h:63
uint32 GetCurrentTaxiPath() const
Definition: PlayerTaxi.cpp:213
Definition: DBCStructure.h:1973
float y
Definition: DBCStructure.h:1979
float x
Definition: DBCStructure.h:1978
uint32 mapid
Definition: DBCStructure.h:1977
float z
Definition: DBCStructure.h:1980

References PlayerTaxi::ClearTaxiDestinations(), PlayerTaxi::GetCurrentTaxiPath(), Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), LOG_DEBUG, m_taxi, TaxiPathNodeEntry::mapid, Unit::RemoveAurasByType(), WorldSession::SendDoFlight(), SetCanTeleport(), SIZE_OF_GRIDS, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiPathNodesByPath, Position::ToString(), TaxiPathNodeEntry::x, TaxiPathNodeEntry::y, and TaxiPathNodeEntry::z.

Referenced by WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), and ProcessDelayedOperations().

◆ ConvertRune()

void Player::ConvertRune ( uint8  index,
RuneType  newType 
)
13365{
13366 SetCurrentRune(index, newType);
13367
13369 data << uint8(index);
13370 data << uint8(newType);
13371 GetSession()->SendPacket(&data);
13372}
@ SMSG_CONVERT_RUNE
Definition: Opcodes.h:1188
void SetCurrentRune(uint8 index, RuneType currentRune)
Definition: Player.h:2491

References GetSession(), WorldSession::SendPacket(), SetCurrentRune(), and SMSG_CONVERT_RUNE.

Referenced by AddRuneByAuraEffect(), RemoveRunesByAuraEffect(), and RestoreBaseRune().

◆ CorrectMetaGemEnchants()

void Player::CorrectMetaGemEnchants ( uint8  slot,
bool  apply 
)
11163{
11164 //cycle all equipped items
11165 for (uint32 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11166 {
11167 //enchants for the slot being socketed are handled by Player::ApplyItemMods
11168 if (slot == exceptslot)
11169 continue;
11170
11171 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11172
11173 if (!pItem || !pItem->HasSocket())
11174 continue;
11175
11176 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11177 {
11178 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11179 if (!enchant_id)
11180 continue;
11181
11182 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11183 if (!enchantEntry)
11184 continue;
11185
11186 uint32 condition = enchantEntry->EnchantmentCondition;
11187 if (condition)
11188 {
11189 //was enchant active with/without item?
11190 bool wasactive = EnchantmentFitsRequirements(condition, apply ? exceptslot : -1);
11191 //should it now be?
11192 if (wasactive ^ EnchantmentFitsRequirements(condition, apply ? -1 : exceptslot))
11193 {
11194 // ignore item gem conditions
11195 //if state changed, (dis)apply enchant
11196 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), !wasactive, true, true);
11197 }
11198 }
11199 }
11200 }
11201}

References ApplyEnchantment(), SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by _ApplyItemMods().

◆ Create()

bool Player::Create ( ObjectGuid::LowType  guidlow,
CharacterCreateInfo createInfo 
)
Todo:
: need more checks against packet modifications
468{
469 // FIXME: outfitId not used in player creating
471 // should check that skin, face, hair* are valid via DBC per race/class
472 // also do it in Player::BuildEnumData, Player::LoadFromDB
473
474 Object::_Create(guidlow, 0, HighGuid::Player);
475
476 m_name = createInfo->Name;
477
478 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
479 if (!info)
480 {
481 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid race/class pair ({}/{}) - refusing to do so.",
482 GetSession()->GetAccountId(), m_name, createInfo->Race, createInfo->Class);
483 return false;
484 }
485
486 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
487 m_items[i] = nullptr;
488
489 Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
490
491 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
492 if (!cEntry)
493 {
494 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid character class ({}) - refusing to do so (wrong DBC-files?)",
495 GetSession()->GetAccountId(), m_name, createInfo->Class);
496 return false;
497 }
498
499 SetMap(sMapMgr->CreateMap(info->mapId, this));
500
501 uint8 powertype = cEntry->powerType;
502
503 SetObjectScale(1.0f);
504
505 m_realRace = createInfo->Race; // set real race flag
506 m_race = createInfo->Race; // set real race flag
507
508 SetFactionForRace(createInfo->Race);
509
510 if (!IsValidGender(createInfo->Gender))
511 {
512 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid gender ({}) - refusing to do so",
513 GetSession()->GetAccountId(), m_name, createInfo->Gender);
514 return false;
515 }
516
517 uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
518
519 SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
521 if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
522 {
525 }
527 SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
528 SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
529
530 // -1 is default value
532
533 SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24)));
535 (0x00 << 8) |
536 (0x00 << 16) |
537 (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24)));
538 SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender);
539 SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
540
544
545 for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
546 SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
548
553
554 // set starting level
556 ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
558
560 {
561 uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
562 if (gm_level > start_level)
563 start_level = gm_level;
564 }
565
566 SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
567
568 InitRunes();
569
571 ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
575
576 // Played time
580
581 // base stats and related field values
586 InitPrimaryProfessions(); // to max set before any spell added
587
588 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
590 {
591 UpdateMaxPower(POWER_MANA); // Update max Mana (for add bonus from intellect)
593 }
594
596 {
601 }
602
603 // original spells
606
607 // original action bar
608 for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr)
609 addActionButton(action_itr->button, action_itr->action, action_itr->type);
610
611 // original items
612 if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Gender))
613 {
614 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
615 {
616 if (oEntry->ItemId[j] <= 0)
617 continue;
618
619 uint32 itemId = oEntry->ItemId[j];
620
621 // just skip, reported in ObjectMgr::LoadItemTemplates
622 ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId);
623 if (!iProto)
624 continue;
625
626 // BuyCount by default
627 uint32 count = iProto->BuyCount;
628
629 // special amount for food/drink
630 if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD)
631 {
632 switch (iProto->Spells[0].SpellCategory)
633 {
634 case SPELL_CATEGORY_FOOD: // food
636 break;
637 case SPELL_CATEGORY_DRINK: // drink
638 count = 2;
639 break;
640 }
641 if (iProto->GetMaxStackSize() < count)
642 count = iProto->GetMaxStackSize();
643 }
644 StoreNewItemInBestSlots(itemId, count);
645 }
646 }
647
648 for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr)
649 StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
650
651 // bags and main-hand weapon must equipped at this moment
652 // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
653 // or ammo not equipped in special bag
655 {
656 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
657 {
658 uint16 eDest;
659 // equip offhand weapon/shield if it attempt equipped before main-hand weapon
660 InventoryResult msg = CanEquipItem(NULL_SLOT, eDest, pItem, false);
661 if (msg == EQUIP_ERR_OK)
662 {
664 EquipItem(eDest, pItem, true);
665 }
666 // move other items to more appropriate slots (ammo not equipped in special bag)
667 else
668 {
669 ItemPosCountVec sDest;
670 msg = CanStoreItem(NULL_BAG, NULL_SLOT, sDest, pItem, false);
671 if (msg == EQUIP_ERR_OK)
672 {
674 pItem = StoreItem(sDest, pItem, true);
675 }
676
677 // if this is ammo then use it
678 msg = CanUseAmmo(pItem->GetEntry());
679 if (msg == EQUIP_ERR_OK)
680 SetAmmo(pItem->GetEntry());
681 }
682 }
683 }
684 // all item positions resolved
685
686 // ensure player starts with full health
689
691
692 return true;
693}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition: DBCStores.cpp:842
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
@ PLAYER_GUILD_TIMESTAMP
Definition: UpdateFields.h:185
@ PLAYER_GUILDID
Definition: UpdateFields.h:179
@ PLAYER_FIELD_COINAGE
Definition: UpdateFields.h:359
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137
@ PLAYER_GUILDRANK
Definition: UpdateFields.h:180
@ UNIT_FIELD_HOVERHEIGHT
Definition: UpdateFields.h:173
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
@ ITEM_CLASS_CONSUMABLE
Definition: ItemTemplate.h:291
@ ITEM_SUBCLASS_FOOD
Definition: ItemTemplate.h:319
@ REST_STATE_RAF_LINKED
Definition: Player.h:985
@ REST_STATE_NOT_RAF_LINKED
Definition: Player.h:984
@ CLASS_CONTEXT_INIT
Definition: UnitDefines.h:206
@ UNIT_FLAG2_REGENERATE_POWER
Definition: UnitDefines.h:278
@ UNIT_BYTE2_FLAG_PVP
Definition: UnitDefines.h:115
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:232
@ CONFIG_START_HEROIC_PLAYER_MONEY
Definition: IWorld.h:245
@ CONFIG_GAME_TYPE
Definition: IWorld.h:222
@ CONFIG_START_GM_LEVEL
Definition: IWorld.h:265
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition: IWorld.h:243
@ CONFIG_START_ARENA_POINTS
Definition: IWorld.h:250
@ CONFIG_START_PLAYER_MONEY
Definition: IWorld.h:244
@ CONFIG_START_PLAYER_LEVEL
Definition: IWorld.h:242
@ CONFIG_START_HONOR_POINTS
Definition: IWorld.h:248
@ REALM_TYPE_RPPVP
Definition: Realm.h:58
@ REALM_TYPE_PVP
Definition: Realm.h:55
#define MAX_OUTFIT_ITEMS
Definition: DBCStructure.h:617
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_RUNE
Definition: SharedDefines.h:274
@ SPELL_CATEGORY_DRINK
Definition: SharedDefines.h:344
@ SPELL_CATEGORY_FOOD
Definition: SharedDefines.h:343
uint32 SpellCategory
Definition: ItemTemplate.h:596
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
Definition: Object.cpp:134
void SetInt32Value(uint16 index, int32 value)
Definition: Object.cpp:637
void SetFloatValue(uint16 index, float value)
Definition: Object.cpp:737
void SetUInt64Value(uint16 index, uint64 value)
Definition: Object.cpp:671
void SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:911
void Relocate(float x, float y)
Definition: Position.h:73
float orientation
Definition: Player.h:344
PlayerCreateInfoActions action
Definition: Player.h:350
PlayerCreateInfoItems item
Definition: Player.h:347
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count)
Definition: Player.cpp:695
void InitPrimaryProfessions()
Definition: Player.cpp:11462
void InitGlyphsForLevel()
Definition: Player.cpp:13233
void UpdateMaxPower(Powers power) override
Definition: StatSystem.cpp:309
void LearnCustomSpells()
Definition: Player.cpp:11789
void SetArenaPoints(uint32 value)
Definition: Player.cpp:6218
void SetObjectScale(float scale) override
Definition: Player.h:1077
void InitDisplayIds()
Definition: Player.cpp:10572
InventoryResult CanUseAmmo(uint32 item) const
Definition: PlayerStorage.cpp:2477
void SetAmmo(uint32 item)
Definition: PlayerStorage.cpp:2507
void SetHonorPoints(uint32 value)
Definition: Player.cpp:6197
void InitTaxiNodesForLevel()
Definition: Player.h:1143
void InitStatsForLevel(bool reapplyMods=false)
Definition: Player.cpp:2567
Item * EquipItem(uint16 pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2742
void InitRunes()
Definition: Player.cpp:13403
void SetMap(Map *map) override
Definition: Player.cpp:14622
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5805
void CheckAllAchievementCriteria()
Definition: Player.cpp:13848
bool HasActivePowerType(Powers power) override
Definition: Player.cpp:2735
void LearnDefaultSkills()
Definition: Player.cpp:11815
void SetFullHealth()
Definition: Unit.h:797
uint8 m_realRace
Definition: Unit.h:1821
uint8 m_race
Definition: Unit.h:1822
void SetUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:832
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15558
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:826
uint8 HairColor
Definition: WorldSession.h:281
uint8 Skin
Definition: WorldSession.h:278
uint8 Class
Definition: WorldSession.h:276
std::string Name
User specified variables.
Definition: WorldSession.h:274
uint8 FacialHair
Definition: WorldSession.h:282
uint8 HairStyle
Definition: WorldSession.h:280
uint8 Face
Definition: WorldSession.h:279
uint8 Gender
Definition: WorldSession.h:277
uint8 Race
Definition: WorldSession.h:275
Definition: DBCStructure.h:620
Definition: DBCStructure.h:653
uint32 powerType
Definition: DBCStructure.h:656

References Object::_Create(), PlayerInfo::action, addActionButton(), ItemTemplate::BuyCount, CanEquipItem(), CanStoreItem(), CanUseAmmo(), CheckAllAchievementCriteria(), ItemTemplate::Class, CharacterCreateInfo::Class, CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, CONFIG_GAME_TYPE, CONFIG_START_ARENA_POINTS, CONFIG_START_GM_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_MONEY, CONFIG_START_HONOR_POINTS, CONFIG_START_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, EQUIP_ERR_OK, EquipItem(), CharacterCreateInfo::Face, CharacterCreateInfo::FacialHair, CharacterCreateInfo::Gender, GetCharStartOutfitEntry(), GameTime::GetGameTime(), GetItemByPos(), Unit::GetMaxPower(), ItemTemplate::GetMaxStackSize(), GetSession(), CharacterCreateInfo::HairColor, CharacterCreateInfo::HairStyle, HasActivePowerType(), InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, IsClass(), AccountMgr::IsPlayerAccount(), IsValidGender(), PlayerInfo::item, ITEM_CLASS_CONSUMABLE, ITEM_SUBCLASS_FOOD, KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), LOG_ERROR, m_items, m_Last_tick, WorldObject::m_name, m_Played_time, Unit::m_race, Unit::m_realRace, PlayerInfo::mapId, MAX_OUTFIT_ITEMS, CharacterCreateInfo::Name, NULL_BAG, NULL_SLOT, PlayerInfo::orientation, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_FIELD_COINAGE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_GUILD_TIMESTAMP, PLAYER_GUILDID, PLAYER_GUILDRANK, PLAYER_SLOTS_COUNT, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, POWER_MANA, POWER_RUNE, POWER_RUNIC_POWER, ChrClassesEntry::powerType, CharacterCreateInfo::Race, REALM_TYPE_PVP, REALM_TYPE_RPPVP, Position::Relocate(), RemoveItem(), REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, sChrClassesStore, SetAmmo(), SetArenaPoints(), Object::SetByteFlag(), Object::SetByteValue(), SetFactionForRace(), Object::SetFloatValue(), Unit::SetFullHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetUInt32Value(), Object::SetUInt64Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), CharacterCreateInfo::Skin, sMapMgr, sObjectMgr, SPELL_CATEGORY_DRINK, SPELL_CATEGORY_FOOD, _Spell::SpellCategory, ItemTemplate::Spells, StoreItem(), StoreNewItemInBestSlots(), ItemTemplate::SubClass, sWorld, UNIT_BYTE2_FLAG_PVP, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_2, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MOD_CAST_SPEED, UpdateAllStats(), and UpdateMaxPower().

◆ CreateCorpse()

Corpse * Player::CreateCorpse ( )
4534{
4535 // prevent existence 2 corpse for player
4537
4538 uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
4539
4541 SetPvPDeath(false);
4542
4543 if (!corpse->Create(GetMap()->GenerateLowGuid<HighGuid::Corpse>(), this))
4544 {
4545 delete corpse;
4546 return nullptr;
4547 }
4548
4550
4551 _uf = getRace();
4554
4555 uint8 race = (uint8)(_uf);
4556 uint8 skin = (uint8)(_pb);
4557 uint8 face = (uint8)(_pb >> 8);
4558 uint8 hairstyle = (uint8)(_pb >> 16);
4559 uint8 haircolor = (uint8)(_pb >> 24);
4560 uint8 facialhair = (uint8)(_pb2);
4561
4562 _cfb1 = ((0x00) | (race << 8) | (GetByteValue(PLAYER_BYTES_3, 0) << 16) | (skin << 24));
4563 _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
4564
4565 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
4566 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2);
4567
4568 uint32 flags = CORPSE_FLAG_UNK2;
4570 flags |= CORPSE_FLAG_HIDE_HELM;
4572 flags |= CORPSE_FLAG_HIDE_CLOAK;
4573
4574 // Xinef: Player can loop corpses while in BG or in WG
4575 if (InBattleground() && !InArena())
4576 flags |= CORPSE_FLAG_LOOTABLE;
4577 Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
4578 if (Bf && Bf->IsWarTime())
4579 flags |= CORPSE_FLAG_LOOTABLE;
4580
4581 corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
4582
4584
4586
4587 uint32 iDisplayID;
4588 uint32 iIventoryType;
4589 uint32 _cfi;
4590 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
4591 {
4592 if (m_items[i])
4593 {
4594 iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID;
4595 iIventoryType = m_items[i]->GetTemplate()->InventoryType;
4596
4597 _cfi = iDisplayID | (iIventoryType << 24);
4598 corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi);
4599 }
4600 }
4601
4602 // register for player, but not show
4603 GetMap()->AddCorpse(corpse);
4604
4606
4607 // we do not need to save corpses for BG/arenas
4608 if (!GetMap()->IsBattlegroundOrArena())
4609 corpse->SaveToDB();
4610
4611 return corpse;
4612}
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ BATTLEFIELD_BATTLEID_WG
Definition: Battlefield.h:37
@ CORPSE_FIELD_BYTES_2
Definition: UpdateFields.h:425
@ CORPSE_FIELD_FLAGS
Definition: UpdateFields.h:427
@ CORPSE_FIELD_BYTES_1
Definition: UpdateFields.h:424
@ CORPSE_FIELD_DISPLAY_ID
Definition: UpdateFields.h:422
@ CORPSE_FIELD_ITEM
Definition: UpdateFields.h:423
@ CORPSE_FIELD_GUILD
Definition: UpdateFields.h:426
@ CORPSE_RESURRECTABLE_PVE
Definition: Corpse.h:29
@ CORPSE_FLAG_HIDE_CLOAK
Definition: Corpse.h:44
@ CORPSE_FLAG_UNK2
Definition: Corpse.h:42
@ CORPSE_FLAG_HIDE_HELM
Definition: Corpse.h:43
@ CORPSE_FLAG_LOOTABLE
Definition: Corpse.h:45
Definition: Battlefield.h:206
bool IsWarTime()
Return true if battle is start, false if battle is not started.
Definition: Battlefield.h:249
void SaveToDB()
Definition: Corpse.cpp:90
bool Create(ObjectGuid::LowType guidlow)
Definition: Corpse.cpp:61
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
void UpdatePositionData()
Definition: Object.cpp:1154
void WorldRelocate(const WorldLocation &loc)
Definition: Position.h:259
WorldLocation _corpseLocation
Definition: Player.h:2963
void SpawnCorpseBones(bool triggerSave=true)
Definition: Player.cpp:4628
void SetPvPDeath(bool on)
Definition: Player.h:1167
bool InArena() const
Definition: Player.cpp:12249
uint32 GetNativeDisplayId() const
Definition: Unit.h:1513
void AddCorpse(Corpse *corpse)
Definition: Map.cpp:3597

References _corpseLocation, Map::AddCorpse(), BATTLEFIELD_BATTLEID_WG, CORPSE_FIELD_BYTES_1, CORPSE_FIELD_BYTES_2, CORPSE_FIELD_DISPLAY_ID, CORPSE_FIELD_FLAGS, CORPSE_FIELD_GUILD, CORPSE_FIELD_ITEM, CORPSE_FLAG_HIDE_CLOAK, CORPSE_FLAG_HIDE_HELM, CORPSE_FLAG_LOOTABLE, CORPSE_FLAG_UNK2, CORPSE_RESURRECTABLE_PVE, CORPSE_RESURRECTABLE_PVP, Corpse::Create(), ItemTemplate::DisplayInfoID, EQUIPMENT_SLOT_END, Object::GetByteValue(), GetGuildId(), WorldObject::GetMap(), Unit::GetNativeDisplayId(), Unit::getRace(), Item::GetTemplate(), Object::GetUInt32Value(), HasPlayerFlag(), InArena(), InBattleground(), ItemTemplate::InventoryType, Battlefield::IsWarTime(), m_ExtraFlags, m_items, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_EXTRA_PVP_DEATH, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, Corpse::SaveToDB(), sBattlefieldMgr, SetPvPDeath(), Object::SetUInt32Value(), SpawnCorpseBones(), WorldObject::UpdatePositionData(), and WorldLocation::WorldRelocate().

Referenced by BuildPlayerRepop().

◆ CreatePet() [1/2]

Pet * Player::CreatePet ( Creature creatureTarget,
uint32  spellID = 0 
)
9158{
9159 if (IsExistPet())
9160 {
9161 return nullptr;
9162 }
9163
9164 if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->IsPlayer())
9165 {
9166 return nullptr;
9167 }
9168
9169 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
9170 if (!creatrueTemplate->family)
9171 {
9172 // Creatures with family 0 crashes the server
9173 return nullptr;
9174 }
9175
9176 // Everything looks OK, create new pet
9177 Pet* pet = CreateTamedPetFrom(creatureTarget, spellID);
9178 if (!pet)
9179 {
9180 return nullptr;
9181 }
9182
9183 // "kill" original creature
9184 creatureTarget->DespawnOrUnsummon();
9185
9186 // calculate proper level
9187 uint8 level = (creatureTarget->GetLevel() < (GetLevel() - 5)) ? (GetLevel() - 5) : GetLevel();
9188
9189 // prepare visual effect for levelup
9190 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
9191
9192 // add to world
9193 pet->GetMap()->AddToMap(pet->ToCreature());
9194
9195 // visual effect for levelup
9196 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
9197
9198 // caster have pet now
9199 SetMinion(pet, true);
9200
9201 pet->InitTalentForLevel();
9202
9205
9206 return pet;
9207}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer)
Definition: Creature.cpp:2173
uint32 family
Definition: CreatureData.h:220
void InitTalentForLevel()
Definition: Pet.cpp:2225
void SavePetToDB(PetSaveMode mode)
Definition: Pet.cpp:507
bool IsExistPet()
Definition: Player.cpp:9151
void PetSpellInitialize()
Definition: Player.cpp:9424
void SetMinion(Minion *minion, bool apply)
Definition: Unit.cpp:10620
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
Definition: Unit.cpp:17268
bool IsPet() const
Definition: Unit.h:754

References Map::AddToMap(), Unit::CreateTamedPetFrom(), Creature::DespawnOrUnsummon(), CreatureTemplate::family, Object::GetEntry(), Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), Unit::IsPet(), Object::IsPlayer(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

Referenced by npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ CreatePet() [2/2]

Pet * Player::CreatePet ( uint32  creatureEntry,
uint32  spellID = 0 
)
9210{
9211 if (IsExistPet())
9212 {
9213 return nullptr;
9214 }
9215
9216 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureEntry);
9217 if (!creatrueTemplate->family)
9218 {
9219 // Creatures with family 0 crashes the server
9220 return nullptr;
9221 }
9222
9223 // Everything looks OK, create new pet
9224 Pet* pet = CreateTamedPetFrom(creatureEntry, spellID);
9225 if (!pet)
9226 {
9227 return nullptr;
9228 }
9229
9230 // prepare visual effect for levelup
9232
9233 // add to world
9234 pet->GetMap()->AddToMap(pet->ToCreature());
9235
9236 // visual effect for levelup
9238
9239 // caster have pet now
9240 SetMinion(pet, true);
9241
9242 pet->InitTalentForLevel();
9243
9246
9247 return pet;
9248}

References Map::AddToMap(), Unit::CreateTamedPetFrom(), CreatureTemplate::family, Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

◆ Customize()

void Player::Customize ( CharacterCustomizeInfo const *  customizeInfo,
CharacterDatabaseTransaction  trans 
)
static
115{
117 stmt->SetData(0, customizeInfo->Gender);
118 stmt->SetData(1, customizeInfo->Skin);
119 stmt->SetData(2, customizeInfo->Face);
120 stmt->SetData(3, customizeInfo->HairStyle);
121 stmt->SetData(4, customizeInfo->HairColor);
122 stmt->SetData(5, customizeInfo->FacialHair);
123 stmt->SetData(6, customizeInfo->Guid.GetCounter());
124
125 CharacterDatabase.ExecuteOrAppend(trans, stmt);
126}
@ CHAR_UPD_GENDER_AND_APPEARANCE
Definition: CharacterDatabase.h:315

References CHAR_UPD_GENDER_AND_APPEARANCE, CharacterDatabase, CharacterCustomizeInfo::Face, CharacterCustomizeInfo::FacialHair, CharacterCustomizeInfo::Gender, ObjectGuid::GetCounter(), CharacterRenameInfo::Guid, CharacterCustomizeInfo::HairColor, CharacterCustomizeInfo::HairStyle, PreparedStatementBase::SetData(), and CharacterCustomizeInfo::Skin.

Referenced by WorldSession::HandleCharCustomizeCallback(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ DeleteEquipmentSet()

void Player::DeleteEquipmentSet ( uint64  setGuid)
14570{
14571 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14572 {
14573 if (itr->second.Guid == setGuid)
14574 {
14575 if (itr->second.state == EQUIPMENT_SET_NEW)
14576 m_EquipmentSets.erase(itr);
14577 else
14578 itr->second.state = EQUIPMENT_SET_DELETED;
14579 break;
14580 }
14581 }
14582}

References EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, and m_EquipmentSets.

Referenced by WorldSession::HandleEquipmentSetDelete().

◆ DeleteFromDB()

void Player::DeleteFromDB ( ObjectGuid::LowType  lowGuid,
uint32  accountId,
bool  updateRealmChars,
bool  deleteFinally 
)
static

Deletes a character from the database

The way, how the characters will be deleted is decided based on the config option.

Parameters
playerguidthe low-GUID from the player which should be deleted
accountIdthe account id from the player
updateRealmCharswhen this flag is set, the amount of characters on that realm will be updated in the realmlist
deleteFinallyif this flag is set, the config option will be ignored and the character will be permanently removed from the database
3955{
3956 // for not existed account avoid update realm
3957 if (!accountId)
3958 updateRealmChars = false;
3959
3960 ObjectGuid playerGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
3961
3962 uint32 charDelete_method = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD);
3963 uint32 charDelete_minLvl = sWorld->getIntConfig(CONFIG_CHARDELETE_MIN_LEVEL);
3964
3965 // if we want to finally delete the character or the character does not meet the level requirement,
3966 // we set it to mode CHAR_DELETE_REMOVE
3967 if (deleteFinally || sCharacterCache->GetCharacterLevelByGuid(playerGuid) < charDelete_minLvl)
3968 charDelete_method = CHAR_DELETE_REMOVE;
3969
3970 if (uint32 guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
3971 if (Guild* guild = sGuildMgr->GetGuildById(guildId))
3972 guild->DeleteMember(playerGuid, false, false, true);
3973
3974 // remove from arena teams
3975 LeaveAllArenaTeams(playerGuid);
3976
3977 // close player ticket if any
3978 GmTicket* ticket = sTicketMgr->GetTicketByPlayer(playerGuid);
3979 if (ticket)
3980 sTicketMgr->CloseTicket(ticket->GetId(), playerGuid);
3981
3982 // remove from group
3983 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(playerGuid))
3984 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
3985 RemoveFromGroup(group, playerGuid);
3986
3987 // Remove signs from petitions (also remove petitions if owner);
3988 RemovePetitionsAndSigns(playerGuid, 10);
3989
3990 CharacterDatabasePreparedStatement* stmt = nullptr;
3991
3992 switch (charDelete_method)
3993 {
3994 // Completely remove from the database
3995 case CHAR_DELETE_REMOVE:
3996 {
3997 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
3998
3999 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL);
4000 stmt->SetData(0, lowGuid);
4001 PreparedQueryResult resultMail = CharacterDatabase.Query(stmt);
4002
4003 if (resultMail)
4004 {
4005 std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
4006
4007 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
4008 stmt->SetData(0, lowGuid);
4009 PreparedQueryResult resultItems = CharacterDatabase.Query(stmt);
4010
4011 if (resultItems)
4012 {
4013 do
4014 {
4015 Field* fields = resultItems->Fetch();
4016 uint32 mailId = fields[14].Get<uint32>();
4017 if (Item* mailItem = _LoadMailedItem(playerGuid, nullptr, mailId, nullptr, fields))
4018 {
4019 itemsByMail[mailId].push_back(mailItem);
4020 }
4021 } while (resultItems->NextRow());
4022 }
4023
4024 do
4025 {
4026 Field* mailFields = resultMail->Fetch();
4027
4028 uint32 mail_id = mailFields[0].Get<uint32>();
4029 uint8 mailType = mailFields[1].Get<uint8>();
4030 uint16 mailTemplateId = mailFields[2].Get<uint16>();
4031 uint32 sender = mailFields[3].Get<uint32>();
4032 std::string subject = mailFields[4].Get<std::string>();
4033 std::string body = mailFields[5].Get<std::string>();
4034 uint32 money = mailFields[6].Get<uint32>();
4035 bool has_items = mailFields[7].Get<bool>();
4036
4037 // We can return mail now
4038 // So firstly delete the old one
4039 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
4040 stmt->SetData(0, mail_id);
4041 trans->Append(stmt);
4042
4043 // Mail is not from player
4044 if (mailType != MAIL_NORMAL)
4045 {
4046 if (has_items)
4047 {
4048 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4049 stmt->SetData(0, mail_id);
4050 trans->Append(stmt);
4051 }
4052 continue;
4053 }
4054
4055 MailDraft draft(subject, body);
4056 if (mailTemplateId)
4057 draft = MailDraft(mailTemplateId, false); // items are already included
4058
4059 auto itemsItr = itemsByMail.find(mail_id);
4060 if (itemsItr != itemsByMail.end())
4061 {
4062 for (Item* item : itemsItr->second)
4063 {
4064 draft.AddItem(item);
4065 }
4066
4067 // MailDraft will take care of freeing memory.
4068 itemsByMail.erase(itemsItr);
4069 }
4070
4071 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4072 stmt->SetData(0, mail_id);
4073 trans->Append(stmt);
4074
4075 uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, lowGuid));
4076
4077 draft.AddMoney(money).SendReturnToSender(pl_account, lowGuid, sender, trans);
4078 } while (resultMail->NextRow());
4079 }
4080
4081 // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet.
4082 // NOW we can finally clear other DB data related to character
4083 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_IDS);
4084 stmt->SetData(0, lowGuid);
4085 PreparedQueryResult resultPets = CharacterDatabase.Query(stmt);
4086
4087 if (resultPets)
4088 {
4089 do
4090 {
4091 ObjectGuid::LowType petguidlow = (*resultPets)[0].Get<uint32>();
4092 Pet::DeleteFromDB(petguidlow);
4093 } while (resultPets->NextRow());
4094 }
4095
4096 // Delete char from social list of online chars
4097 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
4098 stmt->SetData(0, lowGuid);
4099 PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
4100
4101 if (resultFriends)
4102 {
4103 do
4104 {
4105 if (Player* pFriend = ObjectAccessor::FindPlayerByLowGUID((*resultFriends)[0].Get<uint32>()))
4106 {
4107 pFriend->GetSocial()->RemoveFromSocialList(playerGuid, SOCIAL_FLAG_ALL);
4108 sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerGuid, false);
4109 }
4110 } while (resultFriends->NextRow());
4111 }
4112
4113 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER);
4114 stmt->SetData(0, lowGuid);
4115 trans->Append(stmt);
4116
4117 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA);
4118 stmt->SetData(0, lowGuid);
4119 trans->Append(stmt);
4120
4121 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME);
4122 stmt->SetData(0, lowGuid);
4123 trans->Append(stmt);
4124
4125 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION);
4126 stmt->SetData(0, lowGuid);
4127 trans->Append(stmt);
4128
4129 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
4130 stmt->SetData(0, lowGuid);
4131 trans->Append(stmt);
4132
4133 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
4134 stmt->SetData(0, lowGuid);
4135 trans->Append(stmt);
4136
4137 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
4138 stmt->SetData(0, lowGuid);
4139 trans->Append(stmt);
4140
4141 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE);
4142 stmt->SetData(0, lowGuid);
4143 trans->Append(stmt);
4144
4145 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY);
4146 stmt->SetData(0, lowGuid);
4147 trans->Append(stmt);
4148
4149 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS);
4150 stmt->SetData(0, lowGuid);
4151 trans->Append(stmt);
4152
4153 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED);
4154 stmt->SetData(0, lowGuid);
4155 trans->Append(stmt);
4156
4157 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION);
4158 stmt->SetData(0, lowGuid);
4159 trans->Append(stmt);
4160
4161 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL);
4162 stmt->SetData(0, lowGuid);
4163 trans->Append(stmt);
4164
4165 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
4166 stmt->SetData(0, lowGuid);
4167 trans->Append(stmt);
4168
4169 if (sWorld->getBoolConfig(CONFIG_DELETE_CHARACTER_TICKET_TRACE))
4170 {
4172 stmt->SetData(0, lowGuid);
4173 trans->Append(stmt);
4174 }
4175 else
4176 {
4177 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS);
4178 stmt->SetData(0, lowGuid);
4179 trans->Append(stmt);
4180 }
4181
4182 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER);
4183 stmt->SetData(0, lowGuid);
4184 trans->Append(stmt);
4185
4186 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
4187 stmt->SetData(0, lowGuid);
4188 trans->Append(stmt);
4189
4190 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
4191 stmt->SetData(0, lowGuid);
4192 trans->Append(stmt);
4193
4194 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL);
4195 stmt->SetData(0, lowGuid);
4196 trans->Append(stmt);
4197
4198 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS);
4199 stmt->SetData(0, lowGuid);
4200 trans->Append(stmt);
4201
4202 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER);
4203 stmt->SetData(0, lowGuid);
4204 trans->Append(stmt);
4205
4207 stmt->SetData(0, lowGuid);
4208 trans->Append(stmt);
4209
4210 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS);
4211 stmt->SetData(0, lowGuid);
4212 trans->Append(stmt);
4213
4214 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
4215 stmt->SetData(0, lowGuid);
4216 trans->Append(stmt);
4217
4218 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS);
4219 stmt->SetData(0, lowGuid);
4220 trans->Append(stmt);
4221
4222 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER);
4223 stmt->SetData(0, lowGuid);
4224 stmt->SetData(1, lowGuid);
4225 trans->Append(stmt);
4226
4227 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER);
4228 stmt->SetData(0, lowGuid);
4229 trans->Append(stmt);
4230
4231 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
4232 stmt->SetData(0, lowGuid);
4233 trans->Append(stmt);
4234
4235 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
4236 stmt->SetData(0, lowGuid);
4237 trans->Append(stmt);
4238
4239 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
4240 stmt->SetData(0, lowGuid);
4241 trans->Append(stmt);
4242
4243 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
4244 stmt->SetData(0, lowGuid);
4245 trans->Append(stmt);
4246
4247 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
4248 stmt->SetData(0, lowGuid);
4249 trans->Append(stmt);
4250
4251 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
4252 stmt->SetData(0, lowGuid);
4253 trans->Append(stmt);
4254
4255 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
4256 stmt->SetData(0, lowGuid);
4257 trans->Append(stmt);
4258
4259 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
4260 stmt->SetData(0, lowGuid);
4261 trans->Append(stmt);
4262
4263 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SETTINGS);
4264 stmt->SetData(0, lowGuid);
4265 trans->Append(stmt);
4266
4267 Corpse::DeleteFromDB(playerGuid, trans);
4268
4269 sScriptMgr->OnDeleteFromDB(trans, lowGuid);
4270
4271 CharacterDatabase.CommitTransaction(trans);
4272 break;
4273 }
4274 // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame
4275 case CHAR_DELETE_UNLINK:
4276 {
4277 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO);
4278
4279 stmt->SetData(0, lowGuid);
4280
4281 CharacterDatabase.Execute(stmt);
4282 break;
4283 }
4284 default:
4285 LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: {}.", charDelete_method);
4286 return;
4287 }
4288
4289 if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByGuid(playerGuid))
4290 {
4291 std::string name = cache->Name;
4292 sCharacterCache->DeleteCharacterCacheEntry(playerGuid, name);
4293 }
4294
4295 if (updateRealmChars)
4296 {
4297 sWorld->UpdateRealmCharCount(accountId);
4298 }
4299}
@ MAIL_NORMAL
Definition: Mail.h:38
#define sTicketMgr
Definition: TicketMgr.h:260
#define sGuildMgr
Definition: GuildMgr.h:51
@ FRIEND_REMOVED
Definition: SocialMgr.h:71
#define sSocialMgr
Definition: SocialMgr.h:147
@ SOCIAL_FLAG_ALL
Definition: SocialMgr.h:44
@ CHAR_DELETE_REMOVE
Definition: Player.h:952
@ CHAR_DELETE_UNLINK
Definition: Player.h:953
@ CONFIG_CHARDELETE_METHOD
Definition: IWorld.h:357
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition: IWorld.h:358
@ CONFIG_DELETE_CHARACTER_TICKET_TRACE
Definition: IWorld.h:141
@ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND
Definition: CharacterDatabase.h:390
@ CHAR_DEL_CHAR_GIFT
Definition: CharacterDatabase.h:405
@ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER
Definition: CharacterDatabase.h:473
@ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:416
@ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:415
@ CHAR_DEL_CHAR_SKILLS
Definition: CharacterDatabase.h:419
@ CHAR_DEL_CHAR_PET_BY_OWNER
Definition: CharacterDatabase.h:472
@ CHAR_DEL_ITEM_INSTANCE_BY_OWNER
Definition: CharacterDatabase.h:128
@ CHAR_DEL_CHAR_DECLINED_NAME
Definition: CharacterDatabase.h:381
@ CHAR_SEL_MAILITEMS
Definition: CharacterDatabase.h:101
@ CHAR_UPD_DELETE_INFO
Definition: CharacterDatabase.h:292
@ CHAR_DEL_CHAR_EQUIPMENTSETS
Definition: CharacterDatabase.h:414
@ CHAR_DEL_PLAYER_ACCOUNT_DATA
Definition: CharacterDatabase.h:203
@ CHAR_DEL_MAIL
Definition: CharacterDatabase.h:411
@ CHAR_DEL_CHAR_TALENT
Definition: CharacterDatabase.h:418
@ CHAR_SEL_CHAR_SOCIAL
Definition: CharacterDatabase.h:348
@ CHAR_DEL_CHAR_INVENTORY
Definition: CharacterDatabase.h:407
@ CHAR_DEL_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:388
@ CHAR_DEL_CHAR_ACTION
Definition: CharacterDatabase.h:403
@ CHAR_SEL_CHAR_PET_IDS
Definition: CharacterDatabase.h:475
@ CHAR_DEL_CHAR_ACHIEVEMENTS
Definition: CharacterDatabase.h:413
@ CHAR_SEL_CHAR_COD_ITEM_MAIL
Definition: CharacterDatabase.h:347
@ CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION
Definition: CharacterDatabase.h:265
@ CHAR_DEL_CHAR_REPUTATION
Definition: CharacterDatabase.h:409
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition: CharacterDatabase.h:364
@ CHAR_DEL_CHARACTER
Definition: CharacterDatabase.h:402
@ CHAR_DEL_CHAR_SOCIAL_BY_GUID
Definition: CharacterDatabase.h:389
@ CHAR_DEL_CHAR_SETTINGS
Definition: CharacterDatabase.h:517
@ CHAR_DEL_CHAR_SPELL
Definition: CharacterDatabase.h:410
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:408
@ CHAR_DEL_PLAYER_GM_TICKETS
Definition: CharacterDatabase.h:264
@ CHAR_DEL_MAIL_ITEMS
Definition: CharacterDatabase.h:412
@ CHAR_DEL_CHAR_INSTANCE
Definition: CharacterDatabase.h:406
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition: ObjectAccessor.cpp:254
Definition: CharacterCache.h:28
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition: Corpse.cpp:119
void DeleteFromDB() override
Definition: Pet.h:171
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Player.cpp:2342
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition: Player.cpp:10064
static void LeaveAllArenaTeams(ObjectGuid guid)
Definition: Player.cpp:10132
Definition: Guild.h:295
Definition: TicketMgr.h:88
uint32 GetId() const
Definition: TicketMgr.h:101

References _LoadMailedItem(), MailDraft::AddItem(), MailDraft::AddMoney(), CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, CHAR_DEL_CHAR_ACHIEVEMENTS, CHAR_DEL_CHAR_ACTION, CHAR_DEL_CHAR_AURA, CHAR_DEL_CHAR_DECLINED_NAME, CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_CHAR_GIFT, CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_INSTANCE, CHAR_DEL_CHAR_INVENTORY, CHAR_DEL_CHAR_PET_BY_OWNER, CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, CHAR_DEL_CHAR_QUESTSTATUS, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, CHAR_DEL_CHAR_REPUTATION, CHAR_DEL_CHAR_SETTINGS, CHAR_DEL_CHAR_SKILLS, CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, CHAR_DEL_CHAR_SOCIAL_BY_GUID, CHAR_DEL_CHAR_SPELL, CHAR_DEL_CHAR_SPELL_COOLDOWN, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHARACTER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, CHAR_DEL_MAIL, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_DEL_MAIL_ITEMS, CHAR_DEL_PLAYER_ACCOUNT_DATA, CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_DEL_PLAYER_GM_TICKETS, CHAR_DEL_PLAYER_HOMEBIND, CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_DELETE_REMOVE, CHAR_DELETE_UNLINK, CHAR_SEL_CHAR_COD_ITEM_MAIL, CHAR_SEL_CHAR_PET_IDS, CHAR_SEL_CHAR_SOCIAL, CHAR_SEL_MAILITEMS, CHAR_UPD_DELETE_INFO, CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION, CharacterDatabase, CONFIG_CHARDELETE_METHOD, CONFIG_CHARDELETE_MIN_LEVEL, CONFIG_DELETE_CHARACTER_TICKET_TRACE, Pet::DeleteFromDB(), Corpse::DeleteFromDB(), ObjectAccessor::FindPlayerByLowGUID(), FRIEND_REMOVED, Field::Get(), GmTicket::GetId(), LeaveAllArenaTeams(), LOG_ERROR, MAIL_NORMAL, RemoveFromGroup(), RemovePetitionsAndSigns(), sCharacterCache, MailDraft::SendReturnToSender(), PreparedStatementBase::SetData(), sGroupMgr, sGuildMgr, SOCIAL_FLAG_ALL, sScriptMgr, sSocialMgr, sTicketMgr, and sWorld.

Referenced by AccountMgr::DeleteAccount(), DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedDeleteCommand(), character_commandscript::HandleCharacterEraseCommand(), and WorldSession::HandleCharDeleteOpcode().

◆ DeleteOldCharacters() [1/2]

void Player::DeleteOldCharacters ( )
static

Characters which were kept back in the database after being deleted and are now too old (see config option "CharDelete.KeepDays"), will be completely deleted.

4305{
4306 uint32 keepDays = sWorld->getIntConfig(CONFIG_CHARDELETE_KEEP_DAYS);
4307 if (!keepDays)
4308 return;
4309
4311}
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition: IWorld.h:356
static void DeleteOldCharacters()
Definition: Player.cpp:4304

References CONFIG_CHARDELETE_KEEP_DAYS, DeleteOldCharacters(), and sWorld.

Referenced by DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedPurgeCommand(), and World::SetInitialWorldSettings().

◆ DeleteOldCharacters() [2/2]

void Player::DeleteOldCharacters ( uint32  keepDays)
static

Characters which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4317{
4318 LOG_INFO("server.loading", "Player::DeleteOldChars: Deleting all characters which have been deleted {} days before...", keepDays);
4319 LOG_INFO("server.loading", " ");
4320
4322 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4323 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4324
4325 if (result)
4326 {
4327 LOG_INFO("server.loading", "Player::DeleteOldChars: Found {} character(s) to delete", result->GetRowCount());
4328 do
4329 {
4330 Field* fields = result->Fetch();
4331 Player::DeleteFromDB(fields[0].Get<uint32>(), fields[1].Get<uint32>(), true, true);
4332 } while (result->NextRow());
4333 }
4334}
@ CHAR_SEL_CHAR_OLD_CHARS
Definition: CharacterDatabase.h:349
constexpr auto DAY
Definition: Common.h:48
static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
Definition: Player.cpp:3954

References CHAR_SEL_CHAR_OLD_CHARS, CharacterDatabase, DAY, DeleteFromDB(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteRefundReference()

void Player::DeleteRefundReference ( ObjectGuid  itemGUID)
15463{
15464 RefundableItemsSet::iterator itr = m_refundableItems.find(itemGUID);
15465 if (itr != m_refundableItems.end())
15466 m_refundableItems.erase(itr);
15467}

References m_refundableItems.

Referenced by _SaveInventory(), Item::SetNotRefundable(), and Item::SetState().

◆ DestroyConjuredItems()

void Player::DestroyConjuredItems ( bool  update)
3358{
3359 // used when entering arena
3360 // destroys all conjured items
3361 LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems");
3362
3363 // in inventory
3365 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3366 if (pItem->IsConjuredConsumable())
3368
3369 // in inventory bags
3371 if (Bag* pBag = GetBagByPos(i))
3372 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3373 if (Item* pItem = pBag->GetItemByPos(j))
3374 if (pItem->IsConjuredConsumable())
3375 DestroyItem(i, j, update);
3376
3377 // in equipment and bag list
3379 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3380 if (pItem->IsConjuredConsumable())
3382}

References DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and LOG_DEBUG.

Referenced by Battleground::AddPlayer().

◆ DestroyForPlayer()

void Player::DestroyForPlayer ( Player target,
bool  onDeath = false 
) const
overridevirtual

Reimplemented from Object.

3828{
3829 Unit::DestroyForPlayer(target, onDeath);
3830
3831 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) // xinef: previously INVENTORY_SLOT_BAG_END
3832 {
3833 if (!m_items[i])
3834 continue;
3835
3836 m_items[i]->DestroyForPlayer(target);
3837 }
3838
3839 if (target == this)
3840 {
3842 {
3843 if (!m_items[i])
3844 continue;
3845
3846 m_items[i]->DestroyForPlayer(target);
3847 }
3849 {
3850 if (!m_items[i])
3851 continue;
3852
3853 m_items[i]->DestroyForPlayer(target);
3854 }
3855 }
3856}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, Object::DestroyForPlayer(), EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

◆ DestroyItem()

void Player::DestroyItem ( uint8  bag,
uint8  slot,
bool  update 
)
3039{
3040 Item* pItem = GetItemByPos(bag, slot);
3041 if (pItem)
3042 {
3043 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
3044 // Also remove all contained items if the item is a bag.
3045 // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow.
3046 if (pItem->IsNotEmptyBag())
3047 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
3048 DestroyItem(slot, i, update);
3049
3050 if (pItem->IsWrapped())
3051 {
3053 stmt->SetData(0, pItem->GetGUID().GetCounter());
3054 CharacterDatabase.Execute(stmt);
3055 }
3056
3058 RemoveItemDurations(pItem);
3059
3060 pItem->SetNotRefundable(this);
3061 pItem->ClearSoulboundTradeable(this);
3062 RemoveTradeableItem(pItem);
3063
3064 ItemTemplate const* proto = pItem->GetTemplate();
3065 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3066 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
3068
3069 ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3070
3071 sScriptMgr->OnItemRemove(this, pItem);
3072
3073 if (bag == INVENTORY_SLOT_BAG_0)
3074 {
3076
3077 // equipment and equipped bags can have applied bonuses
3078 if (slot < INVENTORY_SLOT_BAG_END)
3079 {
3080 ItemTemplate const* pProto = pItem->GetTemplate();
3081
3082 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
3083 if (pProto && pProto->ItemSet)
3084 RemoveItemsSetItem(this, pProto);
3085
3086 _ApplyItemMods(pItem, slot, false);
3087 }
3088
3089 if (slot < EQUIPMENT_SLOT_END)
3090 {
3091 // remove item dependent auras and casts (only weapon and armor slots)
3093
3094 // update expertise and armor penetration - passive auras may need it
3095 switch (slot)
3096 {
3101 default:
3102 break;
3103 }
3104
3105 if (slot == EQUIPMENT_SLOT_MAINHAND)
3107 else if (slot == EQUIPMENT_SLOT_OFFHAND)
3109
3110 // equipment visual show
3111 SetVisibleItemSlot(slot, nullptr);
3112 }
3113
3114 m_items[slot] = nullptr;
3115 }
3116 else if (Bag* pBag = GetBagByPos(bag))
3117 pBag->RemoveItem(slot, update);
3118
3119 // Xinef: item is removed, remove loot from storage if any
3120 if (proto->HasFlag(ITEM_FLAG_HAS_LOOT))
3121 sLootItemStorage->RemoveStoredLoot(pItem->GetGUID());
3122
3123 if (IsInWorld() && update)
3124 {
3125 pItem->RemoveFromWorld();
3126 pItem->DestroyForPlayer(this);
3127 }
3128
3129 //pItem->SetOwnerGUID(0);
3131 pItem->SetSlot(NULL_SLOT);
3132 pItem->SetState(ITEM_REMOVED, this);
3133 }
3134}
@ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE
Definition: ItemTemplate.h:87
@ CHAR_DEL_GIFT
Definition: CharacterDatabase.h:130
bool IsWrapped() const
Definition: Item.h:263
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1868
void RemoveItemDependentAurasAndCasts(Item *pItem)
Definition: Player.cpp:12524
void RecalculateRating(CombatRating cr)
Definition: Player.h:1938
void UpdateExpertise(WeaponAttackType attType)
Definition: StatSystem.cpp:877
void SetVisibleItemSlot(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2873

References _ApplyItemMods(), BASE_ATTACK, CHAR_DEL_GIFT, CharacterDatabase, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), DestroyItem(), ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Item::GetCount(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), Item::IsNotEmptyBag(), Item::IsWrapped(), ITEM_FIELD_CONTAINED, ITEM_FLAG_HAS_LOOT, ITEM_REMOVED, ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, ItemRemovedQuestCheck(), ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_BAG_SIZE, MAX_ITEM_PROTO_SPELLS, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), Unit::RemoveAurasDueToSpell(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), PreparedStatementBase::SetData(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetSlot(), Item::SetState(), SetVisibleItemSlot(), sLootItemStorage, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, and UpdateExpertise().

Referenced by AddQuestAndCheckCompletion(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), WorldSession::DoLootRelease(), Spell::EffectSummonChangeItem(), bg_commandscript::HandleBagsClearCommand(), debug_commandscript::HandleDebugItemExpireCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), RefundItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), and Item::UpdateDuration().

◆ DestroyItemCount() [1/2]

void Player::DestroyItemCount ( Item item,
uint32 count,
bool  update 
)
3413{
3414 if (!pItem)
3415 return;
3416
3417 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item ({}, Entry: {}) count = {}", pItem->GetGUID().ToString(), pItem->GetEntry(), count);
3418
3419 if (pItem->GetCount() <= count)
3420 {
3421 count -= pItem->GetCount();
3422
3423 DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), update);
3424 }
3425 else
3426 {
3427 ItemRemovedQuestCheck(pItem->GetEntry(), count);
3428 pItem->SetCount(pItem->GetCount() - count);
3429 count = 0;
3430 if (IsInWorld() && update)
3431 pItem->SendUpdateToPlayer(this);
3432 pItem->SetState(ITEM_CHANGED, this);
3433 }
3434}

References DestroyItem(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetSlot(), Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), LOG_DEBUG, Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), and ObjectGuid::ToString().

◆ DestroyItemCount() [2/2]

void Player::DestroyItemCount ( uint32  item,
uint32  count,
bool  update,
bool  unequip_check = false 
)
3137{
3138 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item = {}, count = {}", itemEntry, count);
3139 uint32 remcount = 0;
3140
3141 // in inventory
3143 {
3144 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3145 {
3146 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3147 {
3148 if (item->GetCount() + remcount <= count)
3149 {
3150 // all items in inventory can unequipped
3151 remcount += item->GetCount();
3153
3154 if (remcount >= count)
3155 return;
3156 }
3157 else
3158 {
3159 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3160 item->SetCount(item->GetCount() - count + remcount);
3161 if (IsInWorld() && update)
3162 item->SendUpdateToPlayer(this);
3163 item->SetState(ITEM_CHANGED, this);
3164 return;
3165 }
3166 }
3167 }
3168 }
3169
3171 {
3172 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3173 {
3174 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3175 {
3176 if (item->GetCount() + remcount <= count)
3177 {
3178 // all keys can be unequipped
3179 remcount += item->GetCount();
3181
3182 if (remcount >= count)
3183 return;
3184 }
3185 else
3186 {
3187 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3188 item->SetCount(item->GetCount() - count + remcount);
3189 if (IsInWorld() && update)
3190 item->SendUpdateToPlayer(this);
3191 item->SetState(ITEM_CHANGED, this);
3192 return;
3193 }
3194 }
3195 }
3196 }
3197
3198 // in inventory bags
3200 {
3201 if (Bag* bag = GetBagByPos(i))
3202 {
3203 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3204 {
3205 if (Item* item = bag->GetItemByPos(j))
3206 {
3207 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3208 {
3209 // all items in bags can be unequipped
3210 if (item->GetCount() + remcount <= count)
3211 {
3212 remcount += item->GetCount();
3213 DestroyItem(i, j, update);
3214
3215 if (remcount >= count)
3216 return;
3217 }
3218 else
3219 {
3220 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3221 item->SetCount(item->GetCount() - count + remcount);
3222 if (IsInWorld() && update)
3223 item->SendUpdateToPlayer(this);
3224 item->SetState(ITEM_CHANGED, this);
3225 return;
3226 }
3227 }
3228 }
3229 }
3230 }
3231 }
3232
3233 // in equipment and bag list
3235 {
3236 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3237 {
3238 if (item && item->GetEntry() == itemEntry && !item->IsInTrade())
3239 {
3240 if (item->GetCount() + remcount <= count)
3241 {
3242 if (!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i, false) == EQUIP_ERR_OK)
3243 {
3244 remcount += item->GetCount();
3246
3247 if (remcount >= count)
3248 return;
3249 }
3250 }
3251 else
3252 {
3253 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3254 item->SetCount(item->GetCount() - count + remcount);
3255 if (IsInWorld() && update)
3256 item->SendUpdateToPlayer(this);
3257 item->SetState(ITEM_CHANGED, this);
3258 return;
3259 }
3260 }
3261 }
3262 }
3263
3264 // in bank
3266 {
3267 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3268 {
3269 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3270 {
3271 if (item->GetCount() + remcount <= count)
3272 {
3273 remcount += item->GetCount();
3275 if (remcount >= count)
3276 return;
3277 }
3278 else
3279 {
3280 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3281 item->SetCount(item->GetCount() - count + remcount);
3282 if (IsInWorld() && update)
3283 item->SendUpdateToPlayer(this);
3284 item->SetState(ITEM_CHANGED, this);
3285 return;
3286 }
3287 }
3288 }
3289 }
3290
3291 // in bank bags
3292 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
3293 {
3294 if (Bag* bag = GetBagByPos(i))
3295 {
3296 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3297 {
3298 if (Item* item = bag->GetItemByPos(j))
3299 {
3300 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3301 {
3302 // all items in bags can be unequipped
3303 if (item->GetCount() + remcount <= count)
3304 {
3305 remcount += item->GetCount();
3306 DestroyItem(i, j, update);
3307
3308 if (remcount >= count)
3309 return;
3310 }
3311 else
3312 {
3313 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3314 item->SetCount(item->GetCount() - count + remcount);
3315 if (IsInWorld() && update)
3316 item->SendUpdateToPlayer(this);
3317 item->SetState(ITEM_CHANGED, this);
3318 return;
3319 }
3320 }
3321 }
3322 }
3323 }
3324 }
3325}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanUnequipItem(), CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by _StoreOrEquipNewItem(), AbandonQuest(), WorldSession::DoLootRelease(), Spell::EffectCreateItem2(), Spell::EffectEnchantItemPerm(), Spell::EffectFeedPet(), Spell::EffectScriptEffect(), FailQuest(), go_ahune_ice_stone::GossipSelect(), misc_commandscript::HandleAddItemCommand(), spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), WorldSession::HandleDestroyItemOpcode(), spell_item_massive_seaforium_charge::HandleItemRemove(), WorldSession::HandleWrapItemOpcode(), npc_brewfest_keg_reciver::MoveInLineOfSight(), at_hor_battered_hilt_throw::OnTrigger(), npc_oculus_drakegiver::RemoveEssence(), RewardQuest(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Spell::TakeAmmo(), Spell::TakeCastItem(), TakeQuestSourceItem(), and Spell::TakeReagents().

◆ DestroyZoneLimitedItem()

void Player::DestroyZoneLimitedItem ( bool  update,
uint32  new_zone 
)
3328{
3329 LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map {} and area {}", GetMapId(), new_zone);
3330
3331 // in inventory
3333 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3334 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3336
3338 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3339 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3341
3342 // in inventory bags
3344 if (Bag* pBag = GetBagByPos(i))
3345 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3346 if (Item* pItem = pBag->GetItemByPos(j))
3347 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3348 DestroyItem(i, j, update);
3349
3350 // in equipment and bag list
3352 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3353 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3355}

References CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), WorldLocation::GetMapId(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by UpdateZone().

◆ DoRandomRoll()

uint32 Player::DoRandomRoll ( uint32  minimum,
uint32  maximum 
)
16127{
16128 ASSERT(minimum <= maximum);
16129
16130 uint32 roll = urand(minimum, maximum);
16131
16133 randomRoll.Min = minimum;
16134 randomRoll.Max = maximum;
16135 randomRoll.Result = roll;
16136 randomRoll.Roller = GetGUID();
16137 if (Group* group = GetGroup())
16138 group->BroadcastPacket(randomRoll.Write(), false);
16139 else
16140 SendDirectMessage(randomRoll.Write());
16141
16142 return roll;
16143}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
Definition: MiscPackets.h:108
uint32 Max
Definition: MiscPackets.h:115
uint32 Result
Definition: MiscPackets.h:116
WorldPacket const * Write() override
Definition: MiscPackets.cpp:76
uint32 Min
Definition: MiscPackets.h:114
ObjectGuid Roller
Definition: MiscPackets.h:117

References ASSERT, GetGroup(), Object::GetGUID(), WorldPackets::Misc::RandomRoll::Max, WorldPackets::Misc::RandomRoll::Min, WorldPackets::Misc::RandomRoll::Result, WorldPackets::Misc::RandomRoll::Roller, SendDirectMessage(), urand(), and WorldPackets::Misc::RandomRoll::Write().

Referenced by WorldSession::HandleRandomRollOpcode(), and spell_item_worn_troll_dice::HandleScript().

◆ DropModCharge()

void Player::DropModCharge ( SpellModifier mod,
Spell spell 
)
10023{
10024 if (spell && mod->ownerAura && mod->charges > 0)
10025 {
10026 if (--mod->charges == 0)
10027 mod->charges = -1;
10028
10029 spell->m_appliedMods.insert(mod->ownerAura);
10030 }
10031}
int16 charges
Definition: Player.h:185
UsedSpellMods m_appliedMods
Definition: Spell.h:545

References SpellModifier::charges, Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ DuelComplete()

void Player::DuelComplete ( DuelCompleteType  type)
6367{
6368 // duel not requested
6369 if (!duel)
6370 return;
6371
6372 // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
6373 if (duel->State == DUEL_STATE_COMPLETED)
6374 return;
6375
6376 Player* opponent = duel->Opponent;
6377 duel->State = DUEL_STATE_COMPLETED;
6378 opponent->duel->State = DUEL_STATE_COMPLETED;
6379
6380 LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '{}' ({}), Opponent: '{}' ({})", GetName(), GetGUID().ToString(), opponent->GetName(), opponent->GetGUID().ToString());
6381
6383 data << uint8((type != DUEL_INTERRUPTED) ? 1 : 0);
6384 SendDirectMessage(&data);
6385 if (opponent->GetSession())
6386 {
6387 opponent->SendDirectMessage(&data);
6388 }
6389
6390 if (type != DUEL_INTERRUPTED)
6391 {
6392 data.Initialize(SMSG_DUEL_WINNER, (1 + 20)); // we guess size
6393 data << uint8(type == DUEL_WON ? 0 : 1); // 0 = just won; 1 = fled
6394 data << opponent->GetName();
6395 data << GetName();
6396 SendMessageToSet(&data, true);
6397 }
6398
6399 sScriptMgr->OnPlayerDuelEnd(opponent, this, type);
6400
6401 switch (type)
6402 {
6403 case DUEL_FLED:
6404 // if initiator and opponent are on the same team
6405 // or initiator and opponent are not PvP enabled, forcibly stop attacking
6406 if (GetTeamId() == opponent->GetTeamId())
6407 {
6408 AttackStop();
6409 opponent->AttackStop();
6410 }
6411 else
6412 {
6413 if (!IsPvP())
6414 {
6415 AttackStop();
6416 }
6417 if (!opponent->IsPvP())
6418 {
6419 opponent->AttackStop();
6420 }
6421 }
6422 break;
6423 case DUEL_WON:
6426
6427 // Credit for quest Death's Challenge
6429 {
6430 opponent->CastSpell(opponent, 52994, true);
6431 }
6432
6433 // Honor points after duel (the winner) - ImpConfig
6434 if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
6435 {
6436 opponent->RewardHonor(nullptr, 1, amount);
6437 }
6438
6439 break;
6440 default:
6441 break;
6442 }
6443
6444 // Victory emote spell
6445 if (type != DUEL_INTERRUPTED)
6446 {
6447 opponent->CastSpell(opponent, 52852, true);
6448 }
6449
6450 // Remove Duel Flag object
6452 if (obj)
6453 {
6454 duel->Initiator->RemoveGameObject(obj, true);
6455 }
6456
6457 /* remove auras */
6458 AuraApplicationMap& itsAuras = opponent->GetAppliedAuras();
6459 for (AuraApplicationMap::iterator i = itsAuras.begin(); i != itsAuras.end();)
6460 {
6461 Aura const* aura = i->second->GetBase();
6462 if (!i->second->IsPositive() && aura->GetCasterGUID() == GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6463 {
6464 opponent->RemoveAura(i);
6465 }
6466 else
6467 {
6468 ++i;
6469 }
6470 }
6471
6473 for (AuraApplicationMap::iterator i = myAuras.begin(); i != myAuras.end();)
6474 {
6475 Aura const* aura = i->second->GetBase();
6476 if (!i->second->IsPositive() && aura->GetCasterGUID() == opponent->GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6477 RemoveAura(i);
6478 else
6479 ++i;
6480 }
6481
6482 // cleanup combo points
6483 if (GetComboTarget() == duel->Opponent)
6484 {
6486 }
6487 else if (GetComboTargetGUID() == duel->Opponent->GetPetGUID())
6488 {
6490 }
6491
6492 if (duel->Opponent->GetComboTarget() == this)
6493 {
6494 duel->Opponent->ClearComboPoints();
6495 }
6496 else if (duel->Opponent->GetComboTargetGUID() == GetPetGUID())
6497 {
6498 duel->Opponent->ClearComboPoints();
6499 }
6500
6501 //cleanups
6505 opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
6506
6507 opponent->duel.reset(nullptr);
6508 duel.reset(nullptr);
6509}
@ PLAYER_DUEL_TEAM
Definition: UpdateFields.h:184
@ DUEL_STATE_COMPLETED
Definition: Player.h:373
@ CLASS_CONTEXT_QUEST
Definition: UnitDefines.h:208
@ CONFIG_HONOR_AFTER_DUEL
Definition: IWorld.h:337
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition: DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition: DBCEnums.h:187
@ DUEL_WON
Definition: SharedDefines.h:3613
@ SMSG_DUEL_WINNER
Definition: Opcodes.h:393
@ SMSG_DUEL_COMPLETE
Definition: Opcodes.h:392
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition: Player.cpp:6020
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5612
bool IsPvP()
Definition: Player.cpp:16178
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:639
void ClearComboPoints()
Definition: Unit.cpp:16792
Unit * GetComboTarget() const
Definition: Unit.h:1635
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition: Unit.cpp:10345
ObjectGuid const GetComboTargetGUID() const
Definition: Unit.h:1636
ObjectGuid GetPetGUID() const
Definition: Unit.h:1167
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, Unit::AttackStop(), Unit::CastSpell(), CLASS_CONTEXT_QUEST, CLASS_DEATH_KNIGHT, Unit::ClearComboPoints(), CONFIG_HONOR_AFTER_DUEL, duel, DUEL_FLED, DUEL_INTERRUPTED, DUEL_STATE_COMPLETED, DUEL_WON, ObjectGuid::Empty, Unit::GetAppliedAuras(), Aura::GetApplyTime(), Aura::GetCasterGUID(), Unit::GetComboTarget(), Unit::GetComboTargetGUID(), Map::GetGameObject(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::GetName(), Unit::GetPetGUID(), GetQuestStatus(), GetSession(), GetTeamId(), WorldPacket::Initialize(), IsClass(), IsPvP(), LOG_DEBUG, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, QUEST_STATUS_INCOMPLETE, Unit::RemoveAura(), RewardHonor(), SendDirectMessage(), SendMessageToSet(), Object::SetGuidValue(), Unit::SetUInt32Value(), SMSG_DUEL_COMPLETE, SMSG_DUEL_WINNER, sScriptMgr, sWorld, ObjectGuid::ToString(), Position::ToString(), and UpdateAchievementCriteria().

Referenced by Unit::_ExitVehicle(), CheckDuelDistance(), CleanupsBeforeDelete(), Unit::DealDamage(), WorldSession::HandleDuelCancelledOpcode(), and TeleportTo().

◆ DurabilityLoss()

void Player::DurabilityLoss ( Item item,
double  percent 
)
4685{
4686 if(!item || percent == 0.0)
4687 return;
4688
4689 uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4690
4691 if (!pMaxDurability)
4692 return;
4693
4694 uint32 pDurabilityLoss = uint32(pMaxDurability * percent);
4695
4696 if (pDurabilityLoss < 1)
4697 pDurabilityLoss = 1;
4698
4699 DurabilityPointsLoss(item, pDurabilityLoss);
4700}
@ ITEM_FIELD_MAXDURABILITY
Definition: UpdateFields.h:70
void DurabilityPointsLoss(Item *item, int32 points)
Definition: Player.cpp:4728

References DurabilityPointsLoss(), Object::GetUInt32Value(), and ITEM_FIELD_MAXDURABILITY.

Referenced by DurabilityLossAll(), Spell::EffectDurabilityDamagePCT(), and Spell::EffectSummonChangeItem().

◆ DurabilityLossAll()

void Player::DurabilityLossAll ( double  percent,
bool  inventory 
)
4659{
4661 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4662 DurabilityLoss(pItem, percent);
4663
4664 if (inventory)
4665 {
4666 // bags not have durability
4667 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4668
4670 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4671 DurabilityLoss(pItem, percent);
4672
4673 // keys not have durability
4674 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4675
4677 if (Bag* pBag = GetBagByPos(i))
4678 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4679 if (Item* pItem = GetItemByPos(i, j))
4680 DurabilityLoss(pItem, percent);
4681 }
4682}
void DurabilityLoss(Item *item, double percent)
Definition: Player.cpp:4684

References DurabilityLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamagePCT(), EnvironmentalDamage(), and WorldSession::SendSpiritResurrect().

◆ DurabilityPointLossForEquipSlot()

void Player::DurabilityPointLossForEquipSlot ( EquipmentSlots  slot)
4761{
4762 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
4763 DurabilityPointsLoss(pItem, 1);
4764}

References DurabilityPointsLoss(), GetItemByPos(), and INVENTORY_SLOT_BAG_0.

Referenced by Unit::DealDamage(), and Spell::TakeAmmo().

◆ DurabilityPointsLoss()

void Player::DurabilityPointsLoss ( Item item,
int32  points 
)
4729{
4731 {
4732 return;
4733 }
4734
4735 int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4736 int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4737 int32 pNewDurability = pOldDurability - points;
4738
4739 if (pNewDurability < 0)
4740 pNewDurability = 0;
4741 else if (pNewDurability > pMaxDurability)
4742 pNewDurability = pMaxDurability;
4743
4744 if (pOldDurability != pNewDurability)
4745 {
4746 // modify item stats _before_ Durability set to 0 to pass _ApplyItemMods internal check
4747 if (pNewDurability == 0 && pOldDurability > 0 && item->IsEquipped())
4748 _ApplyItemMods(item, item->GetSlot(), false);
4749
4750 item->SetUInt32Value(ITEM_FIELD_DURABILITY, pNewDurability);
4751
4752 // modify item stats _after_ restore durability to pass _ApplyItemMods internal check
4753 if (pNewDurability > 0 && pOldDurability == 0 && item->IsEquipped())
4754 _ApplyItemMods(item, item->GetSlot(), true);
4755
4756 item->SetState(ITEM_CHANGED, this);
4757 }
4758}
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition: SpellAuraDefines.h:352
@ ITEM_FIELD_DURABILITY
Definition: UpdateFields.h:69

References _ApplyItemMods(), Item::GetSlot(), Object::GetUInt32Value(), Unit::HasAuraType(), Item::IsEquipped(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, Item::SetState(), Object::SetUInt32Value(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by DurabilityLoss(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), and Spell::EffectDurabilityDamage().

◆ DurabilityPointsLossAll()

void Player::DurabilityPointsLossAll ( int32  points,
bool  inventory 
)
4703{
4705 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4706 DurabilityPointsLoss(pItem, points);
4707
4708 if (inventory)
4709 {
4710 // bags not have durability
4711 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4712
4714 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4715 DurabilityPointsLoss(pItem, points);
4716
4717 // keys not have durability
4718 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4719
4721 if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4722 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4723 if (Item* pItem = GetItemByPos(i, j))
4724 DurabilityPointsLoss(pItem, points);
4725 }
4726}

References DurabilityPointsLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamage().

◆ DurabilityRepair()

uint32 Player::DurabilityRepair ( uint16  pos,
bool  cost,
float  discountMod,
bool  guildBank 
)
4783{
4784 Item* item = GetItemByPos(pos);
4785
4786 uint32 TotalCost = 0;
4787 if (!item)
4788 return TotalCost;
4789
4790 uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4791 if (!maxDurability)
4792 return TotalCost;
4793
4794 uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4795
4796 if (cost)
4797 {
4798 uint32 LostDurability = maxDurability - curDurability;
4799 if (LostDurability > 0)
4800 {
4801 ItemTemplate const* ditemProto = item->GetTemplate();
4802
4803 DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel);
4804 if (!dcost)
4805 {
4806 LOG_ERROR("entities.player", "RepairDurability: Wrong item lvl {}", ditemProto->ItemLevel);
4807 return TotalCost;
4808 }
4809
4810 uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2;
4811 DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
4812 if (!dQualitymodEntry)
4813 {
4814 LOG_ERROR("entities.player", "RepairDurability: Wrong dQualityModEntry {}", dQualitymodEntryId);
4815 return TotalCost;
4816 }
4817
4818 uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)];
4819 uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod));
4820
4821 costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST));
4822
4823 if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT
4824 costs = 1;
4825
4826 if (guildBank)
4827 {
4828 if (GetGuildId() == 0)
4829 {
4830 // LOG_DEBUG("entities.player", "You are not member of a guild");
4831 return TotalCost;
4832 }
4833
4834 Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
4835 if (!guild)
4836 return TotalCost;
4837
4838 if (!guild->HandleMemberWithdrawMoney(GetSession(), costs, true))
4839 return TotalCost;
4840
4841 TotalCost = costs;
4842 }
4843 else if (!HasEnoughMoney(costs))
4844 {
4845 // LOG_DEBUG("entities.player", "You do not have enough money");
4846 return TotalCost;
4847 }
4848 else
4849 ModifyMoney(-int32(costs));
4850 }
4851 }
4852
4853 item->SetUInt32Value(ITEM_FIELD_DURABILITY, maxDurability);
4854 item->SetState(ITEM_CHANGED, this);
4855
4856 // reapply mods for total broken and repaired item if equipped
4857 if (IsEquipmentPos(pos) && !curDurability)
4858 _ApplyItemMods(item, pos & 255, true);
4859 return TotalCost;
4860}
DBCStorage< DurabilityQualityEntry > sDurabilityQualityStore(DurabilityQualityfmt)
DBCStorage< DurabilityCostsEntry > sDurabilityCostsStore(DurabilityCostsfmt)
uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
Definition: ItemTemplate.h:557
@ RATE_REPAIRCOST
Definition: IWorld.h:481
uint32 ItemLevel
Definition: ItemTemplate.h:635
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
Definition: Guild.cpp:1691
Definition: DBCStructure.h:878
uint32 multiplier[29]
Definition: DBCStructure.h:880
Definition: DBCStructure.h:884
float quality_mod
Definition: DBCStructure.h:886

References _ApplyItemMods(), ItemTemplate::Class, GetGuildId(), GetItemByPos(), GetSession(), Item::GetTemplate(), Object::GetUInt32Value(), Guild::HandleMemberWithdrawMoney(), HasEnoughMoney(), IsEquipmentPos(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, ItemTemplate::ItemLevel, ItemSubClassToDurabilityMultiplierId(), LOG_ERROR, ModifyMoney(), DurabilityCostsEntry::multiplier, ItemTemplate::Quality, DurabilityQualityEntry::quality_mod, RATE_REPAIRCOST, sDurabilityCostsStore, sDurabilityQualityStore, Item::SetState(), Object::SetUInt32Value(), sGuildMgr, ItemTemplate::SubClass, and sWorld.

Referenced by DurabilityRepairAll(), and WorldSession::HandleRepairItemOpcode().

◆ DurabilityRepairAll()

uint32 Player::DurabilityRepairAll ( bool  cost,
float  discountMod,
bool  guildBank 
)
4767{
4768 uint32 TotalCost = 0;
4769 // equipped, backpack, bags itself
4771 TotalCost += DurabilityRepair(((INVENTORY_SLOT_BAG_0 << 8) | i), cost, discountMod, guildBank);
4772
4773 // bank, buyback and keys not repaired
4774
4775 // items in inventory bags
4777 for (uint8 i = 0; i < MAX_BAG_SIZE; i++)
4778 TotalCost += DurabilityRepair(((j << 8) | i), cost, discountMod, guildBank);
4779 return TotalCost;
4780}
uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank)
Definition: Player.cpp:4782

References DurabilityRepair(), EQUIPMENT_SLOT_START, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and MAX_BAG_SIZE.

Referenced by WorldSession::HandleRepairItemOpcode().

◆ EnchantmentFitsRequirements()

bool Player::EnchantmentFitsRequirements ( uint32  enchantmentcondition,
int8  slot 
)
11076{
11077 if (!enchantmentcondition)
11078 return true;
11079
11080 SpellItemEnchantmentConditionEntry const* Condition = sSpellItemEnchantmentConditionStore.LookupEntry(enchantmentcondition);
11081
11082 if (!Condition)
11083 return true;
11084
11085 uint8 curcount[4] = {0, 0, 0, 0};
11086
11087 //counting current equipped gem colors
11089 {
11090 if (i == slot)
11091 continue;
11093 if (pItem2 && !pItem2->IsBroken() && pItem2->HasSocket())
11094 {
11095 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot <= PRISMATIC_ENCHANTMENT_SLOT; ++enchant_slot)
11096 {
11097 if (enchant_slot == BONUS_ENCHANTMENT_SLOT)
11098 continue;
11099
11100 uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11101 if (!enchant_id)
11102 continue;
11103
11104 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11105 if (!enchantEntry)
11106 continue;
11107
11108 uint32 gemid = enchantEntry->GemID;
11109 if (!gemid)
11110 continue;
11111
11112 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid);
11113 if (!gemProto)
11114 continue;
11115
11116 GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GemProperties);
11117 if (!gemProperty)
11118 continue;
11119
11120 uint8 GemColor = gemProperty->color;
11121
11122 for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1)
11123 {
11124 if (tmpcolormask & GemColor)
11125 ++curcount[b];
11126 }
11127 }
11128 }
11129 }
11130
11131 bool activate = true;
11132
11133 for (uint8 i = 0; i < 5; i++)
11134 {
11135 if (!Condition->Color[i])
11136 continue;
11137
11138 uint32 _cur_gem = curcount[Condition->Color[i] - 1];
11139
11140 // if have <CompareColor> use them as count, else use <value> from Condition
11141 uint32 _cmp_gem = Condition->CompareColor[i] ? curcount[Condition->CompareColor[i] - 1] : Condition->Value[i];
11142
11143 switch (Condition->Comparator[i])
11144 {
11145 case 2: // requires less <color> than (<value> || <comparecolor>) gems
11146 activate &= (_cur_gem < _cmp_gem);
11147 break;
11148 case 3: // requires more <color> than (<value> || <comparecolor>) gems
11149 activate &= (_cur_gem > _cmp_gem);
11150 break;
11151 case 5: // requires at least <color> than (<value> || <comparecolor>) gems
11152 activate &= (_cur_gem >= _cmp_gem);
11153 break;
11154 }
11155 }
11156
11157 LOG_DEBUG("entities.player.items", "Checking Condition {}, there are {} Meta Gems, {} Red Gems, {} Yellow Gems and {} Blue Gems, Activate:{}", enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no");
11158
11159 return activate;
11160}
DBCStorage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
@ BONUS_ENCHANTMENT_SLOT
Definition: Item.h:174
Definition: ConditionMgr.h:194
uint32 GemProperties
Definition: ItemTemplate.h:683
Definition: DBCStructure.h:1014
uint32 color
Definition: DBCStructure.h:1017
Definition: DBCStructure.h:1860

References BONUS_ENCHANTMENT_SLOT, GemPropertiesEntry::color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, SpellItemEnchantmentEntry::GemID, ItemTemplate::GemProperties, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), LOG_DEBUG, PRISMATIC_ENCHANTMENT_SLOT, sGemPropertiesStore, sObjectMgr, SOCK_ENCHANTMENT_SLOT, sSpellItemEnchantmentConditionStore, and sSpellItemEnchantmentStore.

Referenced by ApplyEnchantment(), and CorrectMetaGemEnchants().

◆ EnvironmentalDamage()

uint32 Player::EnvironmentalDamage ( EnviromentalDamage  type,
uint32  damage 
)
754{
756 return 0;
757
758 // Absorb, resist some environmental damage type
759 uint32 absorb = 0;
760 uint32 resist = 0;
761
762 switch (type)
763 {
764 case DAMAGE_LAVA:
765 case DAMAGE_SLIME:
766 {
767 DamageInfo dmgInfo(this, this, damage, nullptr, type == DAMAGE_LAVA ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE);
768 Unit::CalcAbsorbResist(dmgInfo);
769 absorb = dmgInfo.GetAbsorb();
770 resist = dmgInfo.GetResist();
771 damage = dmgInfo.GetDamage();
772 }
773 default:
774 break;
775 }
776
777 Unit::DealDamageMods(this, damage, &absorb);
778
780 packet.Victim = GetGUID();
781 packet.Type = type != DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL;
782 packet.Amount = damage;
783 packet.Absorbed = absorb;
784 packet.Resisted = resist;
785 SendMessageToSet(packet.Write(), true);
786
787 uint32 final_damage = Unit::DealDamage(this, this, damage, nullptr, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
788
789 if (!IsAlive())
790 {
791 if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
792 {
793 LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '{}' ({}) fall to death, losing {} durability",
796 // durability lost message
798 }
799
801 }
802
803 return final_damage;
804}
@ DAMAGE_SLIME
Definition: Player.h:838
@ DAMAGE_FALL
Definition: Player.h:836
@ DAMAGE_LAVA
Definition: Player.h:837
@ DAMAGE_FALL_TO_VOID
Definition: Player.h:840
@ SELF_DAMAGE
Definition: Unit.h:253
@ DIRECT_DAMAGE
Definition: Unit.h:248
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:515
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition: DBCEnums.h:140
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
void DurabilityLossAll(double percent, bool inventory)
Definition: Player.cpp:4658
void SendDurabilityLoss()
Definition: Player.cpp:4653
bool IsImmuneToEnvironmentalDamage()
Definition: Player.cpp:747
Definition: Unit.h:330
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2114
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:787
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:797
Definition: CombatLogPackets.h:29
ObjectGuid Victim
Definition: CombatLogPackets.h:35
uint32 Amount
Definition: CombatLogPackets.h:37
uint32 Absorbed
Definition: CombatLogPackets.h:39
EnviromentalDamage Type
Definition: CombatLogPackets.h:36
uint32 Resisted
Definition: CombatLogPackets.h:38
WorldPacket const * Write() override
Definition: CombatLogPackets.cpp:20

References WorldPackets::CombatLog::EnvironmentalDamageLog::Absorbed, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, WorldPackets::CombatLog::EnvironmentalDamageLog::Amount, Unit::CalcAbsorbResist(), DAMAGE_FALL, DAMAGE_FALL_TO_VOID, DAMAGE_LAVA, DAMAGE_SLIME, Unit::DealDamage(), Unit::DealDamageMods(), DIRECT_DAMAGE, DurabilityLossAll(), DamageInfo::GetAbsorb(), DamageInfo::GetDamage(), Object::GetGUID(), WorldObject::GetName(), DamageInfo::GetResist(), Unit::IsAlive(), IsImmuneToEnvironmentalDamage(), LOG_DEBUG, RATE_DURABILITY_LOSS_ON_DEATH, WorldPackets::CombatLog::EnvironmentalDamageLog::Resisted, SELF_DAMAGE, SendDurabilityLoss(), SendMessageToSet(), SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, sWorld, Position::ToString(), WorldPackets::CombatLog::EnvironmentalDamageLog::Type, UpdateAchievementCriteria(), WorldPackets::CombatLog::EnvironmentalDamageLog::Victim, and WorldPackets::CombatLog::EnvironmentalDamageLog::Write().

Referenced by Spell::EffectEnvironmentalDMG(), HandleDrowning(), HandleFall(), and WorldSession::HandleMovementOpcodes().

◆ EquipItem()

Item * Player::EquipItem ( uint16  pos,
Item pItem,
bool  update 
)
2743{
2745 AddItemDurations(pItem);
2746
2747 uint8 bag = pos >> 8;
2748 uint8 slot = pos & 255;
2749
2750 Item* pItem2 = GetItemByPos(bag, slot);
2751
2752 if (!pItem2)
2753 {
2754 VisualizeItem(slot, pItem);
2755
2756 if (IsAlive())
2757 {
2758 ItemTemplate const* pProto = pItem->GetTemplate();
2759
2760 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2761 if (pProto && pProto->ItemSet)
2762 AddItemsSetItem(this, pItem);
2763
2764 _ApplyItemMods(pItem, slot, true);
2765
2766 if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
2767 {
2768 uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
2769 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
2770
2771 if (!spellProto)
2772 LOG_ERROR("entities.player", "Weapon switch cooldown spell {} couldn't be found in Spell.dbc", cooldownSpell);
2773 else
2774 {
2776
2778
2779 WorldPacket data;
2781 GetSession()->SendPacket(&data);
2782 }
2783 }
2784 }
2785
2786 if (IsInWorld() && update)
2787 {
2788 pItem->AddToWorld();
2789 pItem->SendUpdateToPlayer(this);
2790 }
2791
2792 ApplyEquipCooldown(pItem);
2793
2794 // update expertise and armor penetration - passive auras may need it
2795
2796 if (slot == EQUIPMENT_SLOT_MAINHAND)
2798
2799 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2801
2802 switch (slot)
2803 {
2808 default:
2809 break;
2810 }
2811 }
2812 else
2813 {
2814 pItem2->SetCount(pItem2->GetCount() + pItem->GetCount());
2815 if (IsInWorld() && update)
2816 pItem2->SendUpdateToPlayer(this);
2817
2818 // delete item (it not in any slot currently)
2819 //pItem->DeleteFromDB();
2820 if (IsInWorld() && update)
2821 {
2822 pItem->RemoveFromWorld();
2823 pItem->DestroyForPlayer(this);
2824 }
2825
2827 RemoveItemDurations(pItem);
2828
2829 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2830 pItem->SetNotRefundable(this);
2831 pItem->ClearSoulboundTradeable(this);
2832 RemoveTradeableItem(pItem);
2833 pItem->SetState(ITEM_REMOVED, this);
2834 pItem2->SetState(ITEM_CHANGED, this);
2835
2836 ApplyEquipCooldown(pItem2);
2837 sScriptMgr->OnEquip(this, pItem2, bag, slot, update);
2838 return pItem2;
2839 }
2840
2841 // only for full equip instead adding to stack
2844
2845 sScriptMgr->OnEquip(this, pItem, bag, slot, update);
2847 return pItem;
2848}
@ SPELL_COOLDOWN_FLAG_INCLUDE_GCD
Starts GCD in addition to normal cooldown specified in the packet.
Definition: Unit.h:617
@ CLASS_CONTEXT_WEAPON_SWAP
Definition: UnitDefines.h:220
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition: DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition: DBCEnums.h:163
void UpdateForQuestWorldObjects()
Definition: PlayerUpdates.cpp:1742
GlobalCooldownMgr & GetGlobalCooldownMgr()
Definition: Player.h:1781
void ApplyEquipCooldown(Item *pItem)
Definition: Player.cpp:11723
void VisualizeItem(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2890
void AddGlobalCooldown(SpellInfo const *spellInfo, uint32 gcd)
Definition: CharmInfo.cpp:410
uint32 StartRecoveryTime
Definition: SpellInfo.h:351

References _ApplyItemMods(), ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), GlobalCooldownMgr::AddGlobalCooldown(), AddItemDurations(), AddItemsSetItem(), Object::AddToWorld(), ApplyEquipCooldown(), BASE_ATTACK, Unit::BuildCooldownPacket(), ItemTemplate::Class, CLASS_CONTEXT_WEAPON_SWAP, CLASS_ROGUE, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, Item::GetCount(), Object::GetEntry(), GetGlobalCooldownMgr(), Object::GetGUID(), GetItemByPos(), GetSession(), Item::GetTemplate(), ItemTemplate::InventoryType, INVTYPE_RELIC, Unit::IsAlive(), IsClass(), Unit::IsInCombat(), Object::IsInWorld(), ITEM_CHANGED, ITEM_CLASS_WEAPON, ITEM_REMOVED, ItemTemplate::ItemSet, LOG_ERROR, m_weaponChangeTimer, OFF_ATTACK, RecalculateRating(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), WorldSession::SendPacket(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetState(), SPELL_COOLDOWN_FLAG_INCLUDE_GCD, sScriptMgr, sSpellMgr, SpellInfo::StartRecoveryTime, UpdateAchievementCriteria(), UpdateExpertise(), UpdateForQuestWorldObjects(), and VisualizeItem().

Referenced by Create(), Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoEquipItemOpcode(), SplitItem(), and SwapItem().

◆ EquipNewItem()

Item * Player::EquipNewItem ( uint16  pos,
uint32  item,
bool  update 
)
2723{
2724 Item* _item = Item::CreateItem(item, 1, this);
2725 if (!_item)
2726 return nullptr;
2727
2728 if (!IsEquipmentPos(pos) || sScriptMgr->CanSaveEquipNewItem(this, _item, pos, update))
2729 {
2730 // pussywizard: obtaining blue or better items saves to db
2731 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2732 if (pProto->Quality >= ITEM_QUALITY_RARE)
2734
2735 ItemAddedQuestCheck(item, 1);
2737 }
2738
2739 return EquipItem(pos, _item, update);
2740}
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition: DBCEnums.h:199
@ ITEM_QUALITY_RARE
Definition: SharedDefines.h:332
void ItemAddedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1829

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), Item::CreateItem(), EquipItem(), IsEquipmentPos(), ITEM_QUALITY_RARE, ItemAddedQuestCheck(), sObjectMgr, sScriptMgr, and UpdateAchievementCriteria().

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ FailQuest()

void Player::FailQuest ( uint32  quest_id)
881{
882 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
883 {
884 QuestStatus qStatus = GetQuestStatus(questId);
885 // xinef: if quest is marked as failed, dont do it again
886 if ((qStatus != QUEST_STATUS_INCOMPLETE) && (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE)))
887 return;
888
890
891 uint16 log_slot = FindQuestSlot(questId);
892
893 if (log_slot < MAX_QUEST_LOG_SIZE)
894 {
895 SetQuestSlotTimer(log_slot, 1);
897 }
898
899 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
900 {
901 QuestStatusData& q_status = m_QuestStatus[questId];
902
903 RemoveTimedQuest(questId);
904 q_status.Timer = 0;
905
906 SendQuestTimerFailed(questId);
907 }
908 else
909 SendQuestFailed(questId);
910
911 // Destroy quest items on quest failure.
912 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
913 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
914 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
915 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
916
917 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
918 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
919 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
920 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
921 }
922}
@ QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE
Definition: QuestDef.h:167
void SendQuestTimerFailed(uint32 quest_id)
Definition: PlayerQuest.cpp:2388
void SendQuestFailed(uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
Definition: PlayerQuest.cpp:2376
void SetQuestSlotTimer(uint16 slot, uint32 timer)
Definition: Player.h:1494
void RemoveTimedQuest(uint32 quest_id)
Definition: Player.h:1545

References BIND_QUEST_ITEM, DestroyItemCount(), FindQuestSlot(), GetQuestStatus(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_FAIL, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, RemoveTimedQuest(), SendQuestFailed(), SendQuestTimerFailed(), SetQuestSlotState(), SetQuestSlotTimer(), SetQuestStatus(), sObjectMgr, and QuestStatusData::Timer.

Referenced by npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), SmartAI::EndPath(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_captain_saeed::npc_captain_saeedAI::JustDied(), npc_doctor::npc_doctorAI::PatientDied(), Map::ScriptsProcess(), Update(), and npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI().

◆ FindEquipSlot()

uint8 Player::FindEquipSlot ( ItemTemplate const *  proto,
uint32  slot,
bool  swap 
) const
132{
133 uint8 slots[4];
134 slots[0] = NULL_SLOT;
135 slots[1] = NULL_SLOT;
136 slots[2] = NULL_SLOT;
137 slots[3] = NULL_SLOT;
138 switch (proto->InventoryType)
139 {
140 case INVTYPE_HEAD:
141 slots[0] = EQUIPMENT_SLOT_HEAD;
142 break;
143 case INVTYPE_NECK:
144 slots[0] = EQUIPMENT_SLOT_NECK;
145 break;
147 slots[0] = EQUIPMENT_SLOT_SHOULDERS;
148 break;
149 case INVTYPE_BODY:
150 slots[0] = EQUIPMENT_SLOT_BODY;
151 break;
152 case INVTYPE_CHEST:
153 case INVTYPE_ROBE:
154 slots[0] = EQUIPMENT_SLOT_CHEST;
155 break;
156 case INVTYPE_WAIST:
157 slots[0] = EQUIPMENT_SLOT_WAIST;
158 break;
159 case INVTYPE_LEGS:
160 slots[0] = EQUIPMENT_SLOT_LEGS;
161 break;
162 case INVTYPE_FEET:
163 slots[0] = EQUIPMENT_SLOT_FEET;
164 break;
165 case INVTYPE_WRISTS:
166 slots[0] = EQUIPMENT_SLOT_WRISTS;
167 break;
168 case INVTYPE_HANDS:
169 slots[0] = EQUIPMENT_SLOT_HANDS;
170 break;
171 case INVTYPE_FINGER:
172 slots[0] = EQUIPMENT_SLOT_FINGER1;
173 slots[1] = EQUIPMENT_SLOT_FINGER2;
174 break;
175 case INVTYPE_TRINKET:
176 slots[0] = EQUIPMENT_SLOT_TRINKET1;
177 slots[1] = EQUIPMENT_SLOT_TRINKET2;
178 break;
179 case INVTYPE_CLOAK:
180 slots[0] = EQUIPMENT_SLOT_BACK;
181 break;
182 case INVTYPE_WEAPON:
183 {
184 slots[0] = EQUIPMENT_SLOT_MAINHAND;
185
186 // suggest offhand slot only if know dual wielding
187 // (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
188 if (CanDualWield())
189 slots[1] = EQUIPMENT_SLOT_OFFHAND;
190 break;
191 }
192 case INVTYPE_SHIELD:
194 case INVTYPE_HOLDABLE:
195 slots[0] = EQUIPMENT_SLOT_OFFHAND;
196 break;
197 case INVTYPE_RANGED:
199 case INVTYPE_THROWN:
200 slots[0] = EQUIPMENT_SLOT_RANGED;
201 break;
202 case INVTYPE_2HWEAPON:
203 slots[0] = EQUIPMENT_SLOT_MAINHAND;
205 {
206 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
207 {
208 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF)
209 {
210 const_cast<Player*>(this)->AutoUnequipOffhandIfNeed(true);
211 break;
212 }
213 }
214 }
215
217 {
218 if (proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || proto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF)
219 {
220 const_cast<Player*>(this)->AutoUnequipOffhandIfNeed(true);
221 break;
222 }
223 }
224 if (CanDualWield() && CanTitanGrip() && proto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && proto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && proto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
225 slots[1] = EQUIPMENT_SLOT_OFFHAND;
226 break;
227 case INVTYPE_TABARD:
228 slots[0] = EQUIPMENT_SLOT_TABARD;
229 break;
231 slots[0] = EQUIPMENT_SLOT_MAINHAND;
232 break;
233 case INVTYPE_BAG:
234 slots[0] = INVENTORY_SLOT_BAG_START + 0;
235 slots[1] = INVENTORY_SLOT_BAG_START + 1;
236 slots[2] = INVENTORY_SLOT_BAG_START + 2;
237 slots[3] = INVENTORY_SLOT_BAG_START + 3;
238 break;
239 case INVTYPE_RELIC:
240 {
241 switch (proto->SubClass)
242 {
245 slots[0] = EQUIPMENT_SLOT_RANGED;
246 break;
249 slots[0] = EQUIPMENT_SLOT_RANGED;
250 break;
253 slots[0] = EQUIPMENT_SLOT_RANGED;
254 break;
257 slots[0] = EQUIPMENT_SLOT_RANGED;
258 break;
261 slots[0] = EQUIPMENT_SLOT_RANGED;
262 break;
263 }
264 break;
265 }
266 default:
267 return NULL_SLOT;
268 }
269
270 if (slot != NULL_SLOT)
271 {
272 if (swap || !GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
273 for (uint8 i = 0; i < 4; ++i)
274 if (slots[i] == slot)
275 return slot;
276 }
277 else
278 {
279 // search free slot at first
280 for (uint8 i = 0; i < 4; ++i)
281 if (slots[i] != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]))
282 // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
283 if (slots[i] != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
284 return slots[i];
285
286 // if not found free and can swap return first appropriate from used
287 for (uint8 i = 0; i < 4; ++i)
288 if (slots[i] != NULL_SLOT && swap)
289 return slots[i];
290 }
291
292 // no free position
293 return NULL_SLOT;
294}
@ ITEM_SUBCLASS_WEAPON_STAFF
Definition: ItemTemplate.h:354
@ INVTYPE_BODY
Definition: ItemTemplate.h:260
@ INVTYPE_FINGER
Definition: ItemTemplate.h:267
@ INVTYPE_HEAD
Definition: ItemTemplate.h:257
@ INVTYPE_ROBE
Definition: ItemTemplate.h:276
@ INVTYPE_HOLDABLE
Definition: ItemTemplate.h:279
@ INVTYPE_TRINKET
Definition: ItemTemplate.h:268
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_WAIST
Definition: ItemTemplate.h:262
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WRISTS
Definition: ItemTemplate.h:265
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_BAG
Definition: ItemTemplate.h:274
@ INVTYPE_NECK
Definition: ItemTemplate.h:258
@ INVTYPE_SHOULDERS
Definition: ItemTemplate.h:259
@ INVTYPE_FEET
Definition: ItemTemplate.h:264
@ INVTYPE_SHIELD
Definition: ItemTemplate.h:270
@ INVTYPE_TABARD
Definition: ItemTemplate.h:275
@ INVTYPE_LEGS
Definition: ItemTemplate.h:263
@ INVTYPE_CHEST
Definition: ItemTemplate.h:261
@ INVTYPE_HANDS
Definition: ItemTemplate.h:266
@ EQUIPMENT_SLOT_SHOULDERS
Definition: Player.h:677
@ EQUIPMENT_SLOT_BODY
Definition: Player.h:678
@ EQUIPMENT_SLOT_HANDS
Definition: Player.h:684
@ EQUIPMENT_SLOT_NECK
Definition: Player.h:676
@ EQUIPMENT_SLOT_TABARD
Definition: Player.h:693
@ EQUIPMENT_SLOT_HEAD
Definition: Player.h:675
@ EQUIPMENT_SLOT_LEGS
Definition: Player.h:681
@ EQUIPMENT_SLOT_BACK
Definition: Player.h:689
@ EQUIPMENT_SLOT_WAIST
Definition: Player.h:680
@ EQUIPMENT_SLOT_FEET
Definition: Player.h:682
@ EQUIPMENT_SLOT_CHEST
Definition: Player.h:679
@ EQUIPMENT_SLOT_WRISTS
Definition: Player.h:683

References AutoUnequipOffhandIfNeed(), Unit::CanDualWield(), CanTitanGrip(), CLASS_CONTEXT_EQUIP_RELIC, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARLOCK, EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_CHEST, EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_HANDS, EQUIPMENT_SLOT_HEAD, EQUIPMENT_SLOT_LEGS, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_NECK, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_SHOULDERS, EQUIPMENT_SLOT_TABARD, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, EQUIPMENT_SLOT_WAIST, EQUIPMENT_SLOT_WRISTS, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_BAG, INVTYPE_BODY, INVTYPE_CHEST, INVTYPE_CLOAK, INVTYPE_FEET, INVTYPE_FINGER, INVTYPE_HANDS, INVTYPE_HEAD, INVTYPE_HOLDABLE, INVTYPE_LEGS, INVTYPE_NECK, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_RELIC, INVTYPE_ROBE, INVTYPE_SHIELD, INVTYPE_SHOULDERS, INVTYPE_TABARD, INVTYPE_THROWN, INVTYPE_TRINKET, INVTYPE_WAIST, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_WRISTS, IsClass(), IsTwoHandUsed(), ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, NULL_SLOT, and ItemTemplate::SubClass.

Referenced by CanEquipItem(), and WorldSession::HandleAutoEquipItemOpcode().

◆ FindQuestSlot()

uint16 Player::FindQuestSlot ( uint32  quest_id) const

◆ GetAchievementMgr()

AchievementMgr * Player::GetAchievementMgr ( ) const
inline
2512{ return m_achievementMgr; }

References m_achievementMgr.

◆ GetActionButton()

ActionButton const * Player::GetActionButton ( uint8  button)
5595{
5596 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5597 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5598 return nullptr;
5599
5600 return &buttonItr->second;
5601}

References ACTIONBUTTON_DELETED, and m_actionButtons.

Referenced by Spell::EffectCastButtons().

◆ GetActiveSpec()

◆ GetActiveSpecMask()

uint8 Player::GetActiveSpecMask ( ) const
inline

◆ GetAmmoDPS()

float Player::GetAmmoDPS ( ) const
inline
1319{ return m_ammoDPS; }

References m_ammoDPS.

Referenced by _ApplyAmmoBonuses(), and CalculateMinMaxDamage().

◆ GetArenaPersonalRating()

uint32 Player::GetArenaPersonalRating ( uint8  slot) const
16152{
16154
16155 sScriptMgr->OnGetArenaPersonalRating(const_cast<Player*>(this), slot, result);
16156
16157 return result;
16158}

References ARENA_TEAM_END, ARENA_TEAM_PERSONAL_RATING, Object::GetUInt32Value(), PLAYER_FIELD_ARENA_TEAM_INFO_1_1, and sScriptMgr.

Referenced by GetMaxPersonalArenaRatingRequirement().

◆ GetArenaPoints()

uint32 Player::GetArenaPoints ( ) const
inline

◆ GetArenaTeamId()

◆ GetArenaTeamIdFromDB()

uint32 Player::GetArenaTeamIdFromDB ( ObjectGuid  guid,
uint8  slot 
)
static
6260{
6262 stmt->SetData(0, guid.GetCounter());
6263 stmt->SetData(1, type);
6264 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6265
6266 if (!result)
6267 return 0;
6268
6269 uint32 id = (*result)[0].Get<uint32>();
6270 return id;
6271}
@ CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID
Definition: CharacterDatabase.h:350

References CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, CharacterDatabase, ObjectGuid::GetCounter(), and PreparedStatementBase::SetData().

Referenced by arena_commandscript::HandleArenaCreateCommand().

◆ GetArenaTeamIdInvited()

◆ GetArmorProficiency()

uint32 Player::GetArmorProficiency ( ) const
inline
1352{ return m_ArmorProficiency; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ GetAttackBySlot()

◆ GetAurasForTarget()

void Player::GetAurasForTarget ( Unit target,
bool  force = false 
)

Blizz sends certain movement packets sometimes even before CreateObject These movement packets are usually found in SMSG_COMPRESSED_MOVES

12013{
12014 if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things
12015 return;
12016
12021 target->SendMovementFeatherFall(this);
12022
12024 target->SendMovementWaterWalking(this);
12025
12026 if (target->HasAuraType(SPELL_AURA_HOVER))
12027 target->SendMovementHover(this);
12028
12030 data<< target->GetPackGUID();
12031
12032 Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
12033 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
12034 {
12035 AuraApplication* auraApp = itr->second;
12036 auraApp->BuildUpdatePacket(data, false);
12037 }
12038
12039 GetSession()->SendPacket(&data);
12040}
@ SPELL_AURA_FEATHER_FALL
Definition: SpellAuraDefines.h:168
@ SPELL_AURA_WATER_WALK
Definition: SpellAuraDefines.h:167
@ SPELL_AURA_HOVER
Definition: SpellAuraDefines.h:169
@ SMSG_AURA_UPDATE_ALL
Definition: Opcodes.h:1203
void SendMovementHover(Player *sendTo)
Definition: Unit.cpp:20604
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:652
void SendMovementWaterWalking(Player *sendTo)
Definition: Unit.cpp:20545
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1494
void SendMovementFeatherFall(Player *sendTo)
Definition: Unit.cpp:20567
Definition: SpellAuras.h:37
void BuildUpdatePacket(ByteBuffer &data, bool remove) const
Definition: SpellAuras.cpp:248

References AuraApplication::BuildUpdatePacket(), Object::GetPackGUID(), GetSession(), Unit::GetVisibleAuras(), Unit::HasAuraType(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), WorldSession::SendPacket(), SMSG_AURA_UPDATE_ALL, SPELL_AURA_FEATHER_FALL, SPELL_AURA_HOVER, and SPELL_AURA_WATER_WALK.

Referenced by GetInitialVisiblePackets(), and Map::SendInitSelf().

◆ GetAuraUpdateMaskForRaid()

uint64 Player::GetAuraUpdateMaskForRaid ( ) const
inline

◆ GetAverageItemLevel()

float Player::GetAverageItemLevel ( )
15673{
15674 float sum = 0;
15675 uint32 count = 0;
15676 uint8 level = GetLevel();
15677
15679 {
15680 // don't check tabard, ranged, offhand or shirt
15682 continue;
15683
15684 if (m_items[i] && m_items[i]->GetTemplate())
15686
15687 ++count;
15688 }
15689
15690 return std::max<float>(0.0f, sum / (float)count);
15691}
float GetItemLevelIncludingQuality(uint8 pLevel) const
Definition: ItemTemplate.h:759

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, ItemTemplate::GetItemLevelIncludingQuality(), Unit::GetLevel(), Item::GetTemplate(), and m_items.

Referenced by spell_gen_vehicle_scaling_aura::CalculateAmount(), gear_commandscript::HandleGearStatsCommand(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetAverageItemLevelForDF()

float Player::GetAverageItemLevelForDF ( )
15694{
15695 float sum = 0;
15696 uint32 count = 0;
15697 uint8 level = GetLevel();
15698
15699 for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
15700 {
15701 // don't check tabard, ranged, offhand or shirt
15703 continue;
15704
15705 if (m_items[i] && m_items[i]->GetTemplate())
15706 {
15707 if (m_items[i]->GetTemplate()->Quality == ITEM_QUALITY_HEIRLOOM)
15708 sum += level * 2.33f;
15709 else
15710 sum += m_items[i]->GetTemplate()->ItemLevel;
15711 }
15712
15713 ++count;
15714 }
15715
15716 return std::max(0.0f, sum / (float)count);
15717}

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, Unit::GetLevel(), Item::GetTemplate(), ITEM_QUALITY_HEIRLOOM, ItemTemplate::ItemLevel, and m_items.

Referenced by lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ GetBagByPos()

◆ GetBankBagSlotCount()

uint8 Player::GetBankBagSlotCount ( ) const
inline

◆ GetBarberShopCost()

uint32 Player::GetBarberShopCost ( uint8  newhairstyle,
uint8  newhaircolor,
uint8  newfacialhair,
BarberShopStyleEntry const *  newSkin = nullptr 
)
13197{
13198 uint8 level = GetLevel();
13199
13200 if (level > GT_MAX_LEVEL)
13201 level = GT_MAX_LEVEL; // max level in this dbc
13202
13203 uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
13204 uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
13205 uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
13206 uint8 skincolor = GetByteValue(PLAYER_BYTES, 0);
13207
13208 if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->hair_id == skincolor)))
13209 return 0;
13210
13211 GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
13212
13213 if (!bsc) // shouldn't happen
13214 return 0xFFFFFFFF;
13215
13216 float cost = 0;
13217
13218 if (hairstyle != newhairstyle)
13219 cost += bsc->cost; // full price
13220
13221 if ((haircolor != newhaircolor) && (hairstyle == newhairstyle))
13222 cost += bsc->cost * 0.5f; // +1/2 of price
13223
13224 if (facialhair != newfacialhair)
13225 cost += bsc->cost * 0.75f; // +3/4 of price
13226
13227 if (newSkin && skincolor != newSkin->hair_id)
13228 cost += bsc->cost * 0.75f; // +5/6 of price
13229
13230 return uint32(cost);
13231}
DBCStorage< GtBarberShopCostBaseEntry > sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt)
#define GT_MAX_LEVEL
Definition: DBCStructure.h:1036
Definition: DBCStructure.h:1042
float cost
Definition: DBCStructure.h:1043

References GtBarberShopCostBaseEntry::cost, Object::GetByteValue(), Unit::GetLevel(), GT_MAX_LEVEL, BarberShopStyleEntry::hair_id, PLAYER_BYTES, PLAYER_BYTES_2, and sGtBarberShopCostBaseStore.

Referenced by WorldSession::HandleAlterAppearance().

◆ GetBaseDefenseSkillValue()

uint32 Player::GetBaseDefenseSkillValue ( ) const
inline
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
uint16 GetBaseSkillValue(uint32 skill) const
Definition: Player.cpp:5444

References GetBaseSkillValue(), and SKILL_DEFENSE.

Referenced by UpdateCombatSkills().

◆ GetBaseModValue()

float Player::GetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType 
) const
5002{
5003 if (modGroup >= BASEMOD_END)
5004 {
5005 LOG_ERROR("entities.player", "trial to access non existed BaseModGroup!");
5006 return 0.0f;
5007 }
5008
5009 if (modType == PCT_MOD && m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5010 return 0.0f;
5011
5012 return m_auraBaseMod[modGroup][modType];
5013}

References BASEMOD_END, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetBaseRune()

RuneType Player::GetBaseRune ( uint8  index) const
inline
2482{ return RuneType(m_runes->runes[index].BaseRune); }
RuneType
Definition: Player.h:408
uint8 BaseRune
Definition: Player.h:418
RuneInfo runes[MAX_RUNES]
Definition: Player.h:427

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by Spell::EffectActivateRune(), GetRuneBaseCooldown(), IsBaseRuneSlotsOnCooldown(), RemoveRunesByAuraEffect(), RestoreBaseRune(), Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetBaseSkillValue()

uint16 Player::GetBaseSkillValue ( uint32  skill) const
5445{
5446 if (!skill)
5447 return 0;
5448
5449 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5450 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5451 return 0;
5452
5453 int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5454 result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos)));
5455 return result < 0 ? 0 : result;
5456}
#define SKILL_PERM_BONUS(x)
Definition: Player.h:87

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_VALUE.

Referenced by npc_engineering_tele_trinket::CanLearn(), GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), GetTrainerSpellState(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), and SatisfyQuestSkill().

◆ GetBaseSpellPowerBonus()

uint32 Player::GetBaseSpellPowerBonus ( )
inline

◆ GetBaseWeaponSkillValue()

uint32 Player::GetBaseWeaponSkillValue ( WeaponAttackType  attType) const
12760{
12761 Item* item = GetWeaponForAttack(attType, true);
12762
12763 // unarmed only with base attack
12764 if (attType != BASE_ATTACK && !item)
12765 return 0;
12766
12767 // weapon skill or (unarmed for base attack)
12768 uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
12769 return GetBaseSkillValue(skill);
12770}
@ SKILL_UNARMED
Definition: SharedDefines.h:2907

References BASE_ATTACK, GetBaseSkillValue(), Item::GetSkill(), GetWeaponForAttack(), and SKILL_UNARMED.

Referenced by UpdateCombatSkills().

◆ GetBattleground()

Battleground * Player::GetBattleground ( bool  create = false) const
12149{
12150 if (GetBattlegroundId() == 0)
12151 return nullptr;
12152
12154 return (create || (bg && bg->FindBgMap()) ? bg : nullptr);
12155}
#define sBattlegroundMgr
Definition: BattlegroundMgr.h:188
BattlegroundMap * FindBgMap() const
Definition: Battleground.h:433
BattlegroundTypeId GetBattlegroundTypeId() const
Definition: Player.h:2231
uint32 GetBattlegroundId() const
Definition: Player.h:2230

References Battleground::FindBgMap(), GetBattlegroundId(), GetBattlegroundTypeId(), and sBattlegroundMgr.

Referenced by GameObject::ActivateToQuest(), CanEquipItem(), Group::CanJoinBattlegroundQueue(), CanUnequipItem(), Spell::CheckCast(), MapInstanced::CreateInstanceForPlayer(), Object::DestroyForPlayer(), Spell::EffectOpenLock(), WorldSession::HandleAreaSpiritHealerQueryOpcode(), WorldSession::HandleAreaSpiritHealerQueueOpcode(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModEffectImmunity(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlegroundPlayerPositionsOpcode(), spell_item_rocket_boots::HandleDummy(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePVPLogDataOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), spell_ioc_gunship_portal::HandleScript2(), InArena(), SpellArea::IsFitToRequirements(), Unit::Kill(), LeaveBattleground(), AchievementCriteriaData::Meets(), Unit::Mount(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_arena_by_type::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_sa_defense_of_the_ancients::OnCheck(), achievement_not_even_a_scratch::OnCheck(), achievement_save_the_day::OnCheck(), go_arena_ready_marker::OnGossipHello(), RepopAtGraveyard(), ReportedAfkBy(), ResurrectPlayer(), RewardHonor(), SendInitWorldStates(), SendLoot(), SummonIfPossible(), AchievementMgr::UpdateAchievementCriteria(), and GameObject::Use().

◆ GetBattlegroundId()

◆ GetBattlegroundQueueIndex()

◆ GetBattlegroundQueueTypeId()

BattlegroundQueueTypeId Player::GetBattlegroundQueueTypeId ( uint32  index) const

◆ GetBattlegroundTypeId()

BattlegroundTypeId Player::GetBattlegroundTypeId ( ) const
inline
2231{ return m_bgData.bgTypeID; }
BattlegroundTypeId bgTypeID
Definition: Player.h:1035

References BGData::bgTypeID, and m_bgData.

Referenced by GetBattleground(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ GetBGAccessByLevel()

bool Player::GetBGAccessByLevel ( BattlegroundTypeId  bgTypeId) const
12271{
12272 // get a template bg instead of running one
12273 Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
12274 if (!bgt)
12275 return false;
12276
12277 // limit check leel to dbc compatible level range
12278 uint32 level = GetLevel();
12279 if (level > DEFAULT_MAX_LEVEL)
12280 level = DEFAULT_MAX_LEVEL;
12281
12282 if (level < bgt->GetMinLevel() || level > bgt->GetMaxLevel())
12283 return false;
12284
12285 return true;
12286}
uint32 GetMaxLevel() const
Definition: Battleground.h:334

References DEFAULT_MAX_LEVEL, Unit::GetLevel(), Battleground::GetMaxLevel(), and sBattlegroundMgr.

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), and Creature::isCanInteractWithBattleMaster().

◆ GetBGData()

BGData & Player::GetBGData ( )
inline
2235{ return m_bgData; }

References m_bgData.

◆ GetBgTeamId()

◆ GetChampioningFaction()

uint32 Player::GetChampioningFaction ( ) const
inline
2526{ return m_ChampioningFaction; }

References m_ChampioningFaction.

Referenced by RewardReputation().

◆ GetChatTag()

uint8 Player::GetChatTag ( ) const
1303{
1304 uint8 tag = CHAT_TAG_NONE;
1305
1306 if (isGMChat())
1307 tag |= CHAT_TAG_GM;
1308 if (isDND())
1309 tag |= CHAT_TAG_DND;
1310 if (isAFK())
1311 tag |= CHAT_TAG_AFK;
1312 if (IsCommentator())
1313 tag |= CHAT_TAG_COM;
1314 if (IsDeveloper())
1315 tag |= CHAT_TAG_DEV;
1316
1317 return tag;
1318}
@ CHAT_TAG_COM
Definition: Player.h:849
@ CHAT_TAG_DND
Definition: Player.h:847
@ CHAT_TAG_DEV
Definition: Player.h:850
@ CHAT_TAG_AFK
Definition: Player.h:846
@ CHAT_TAG_GM
Definition: Player.h:848
@ CHAT_TAG_NONE
Definition: Player.h:845
bool IsCommentator() const
Definition: Player.h:1151
bool isGMChat() const
Definition: Player.h:1159
bool isDND() const
Definition: Player.h:1134
bool IsDeveloper() const
Definition: Player.h:1153
bool isAFK() const
Definition: Player.h:1133

References CHAT_TAG_AFK, CHAT_TAG_COM, CHAT_TAG_DEV, CHAT_TAG_DND, CHAT_TAG_GM, CHAT_TAG_NONE, isAFK(), IsCommentator(), IsDeveloper(), isDND(), and isGMChat().

◆ getCinematic()

uint8 Player::getCinematic ( ) const
inline
1808 {
1809 return m_cinematic;
1810 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ GetCinematicMgr()

CinematicMgr * Player::GetCinematicMgr ( ) const
inline

◆ GetCommandStatus()

◆ GetCorpse()

◆ GetCorpseLocation()

◆ GetCorpseReclaimDelay()

uint32 Player::GetCorpseReclaimDelay ( bool  pvp) const
12867{
12868 if (pvp)
12869 {
12870 if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP))
12871 return copseReclaimDelay[0];
12872 }
12873 else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))
12874 return 0;
12875
12876 time_t now = GameTime::GetGameTime().count();
12877 // 0..2 full period
12878 // should be std::ceil(x)-1 but not floor(x)
12879 uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0;
12880 return copseReclaimDelay[count];
12881}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, and sWorld.

Referenced by CalculateCorpseReclaimDelay(), and WorldSession::HandleReclaimCorpseOpcode().

◆ GetCreationTime()

Seconds Player::GetCreationTime ( ) const
inline
2515{ return m_creationTime; }

References m_creationTime.

◆ GetCurrentBattlegroundQueueSlot()

uint32 Player::GetCurrentBattlegroundQueueSlot ( ) const
inline

◆ GetCurrentRune()

RuneType Player::GetCurrentRune ( uint8  index) const
inline

◆ GetDeathTimer()

uint32 Player::GetDeathTimer ( ) const
inline
2152{ return m_deathTimer; }

References m_deathTimer.

Referenced by WorldSession::LogoutPlayer().

◆ GetDebugInfo()

std::string Player::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

16301{
16302 std::stringstream sstr;
16303 sstr << Unit::GetDebugInfo();
16304 return sstr.str();
16305}
std::string GetDebugInfo() const override
Definition: Unit.cpp:21217

References Unit::GetDebugInfo().

◆ GetDeclinedNames()

DeclinedName const * Player::GetDeclinedNames ( ) const
inline
2480{ return m_declinedname; }

References m_declinedname.

◆ GetDefaultGossipMenuForSource()

uint32 Player::GetDefaultGossipMenuForSource ( WorldObject source)
static
423{
424 switch (source->GetTypeId())
425 {
426 case TYPEID_UNIT:
427 return source->ToCreature()->GetCreatureTemplate()->GossipMenuId;
429 return source->ToGameObject()->GetGOInfo()->GetGossipMenuId();
430 default:
431 break;
432 }
433
434 return 0;
435}
uint32 GossipMenuId
Definition: CreatureData.h:197
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:137
uint32 GetGossipMenuId() const
Definition: GameObjectData.h:553

References Creature::GetCreatureTemplate(), GameObject::GetGOInfo(), GameObjectTemplate::GetGossipMenuId(), Object::GetTypeId(), CreatureTemplate::GossipMenuId, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GetGossipTextId(), and PrepareGossipMenu().

◆ GetDelayedOperations()

uint32 Player::GetDelayedOperations ( ) const
inline

◆ GetDifficulty()

◆ GetDivider()

◆ GetDodgeFromAgility()

void Player::GetDodgeFromAgility ( float &  diminishing,
float &  nondiminishing 
)
Todo:
: research if talents/effects that increase total agility by x% should increase non-diminishing part
5056{
5057 // Table for base dodge values
5058 const float dodge_base[MAX_CLASSES] =
5059 {
5060 0.036640f, // Warrior
5061 0.034943f, // Paladi
5062 -0.040873f, // Hunter
5063 0.020957f, // Rogue
5064 0.034178f, // Priest
5065 0.036640f, // DK
5066 0.021080f, // Shaman
5067 0.036587f, // Mage
5068 0.024211f, // Warlock
5069 0.0f, // ??
5070 0.056097f // Druid
5071 };
5072 // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
5073 const float crit_to_dodge[MAX_CLASSES] =
5074 {
5075 0.85f / 1.15f, // Warrior
5076 1.00f / 1.15f, // Paladin
5077 1.11f / 1.15f, // Hunter
5078 2.00f / 1.15f, // Rogue
5079 1.00f / 1.15f, // Priest
5080 0.85f / 1.15f, // DK
5081 1.60f / 1.15f, // Shaman
5082 1.00f / 1.15f, // Mage
5083 0.97f / 1.15f, // Warlock (?)
5084 0.0f, // ??
5085 2.00f / 1.15f // Druid
5086 };
5087
5088 uint8 level = GetLevel();
5089 uint32 pclass = getClass();
5090
5091 if (level > GT_MAX_LEVEL)
5092 level = GT_MAX_LEVEL;
5093
5094 // Dodge per agility is proportional to crit per agility, which is available from DBC files
5095 GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5096 if (!dodgeRatio || pclass > MAX_CLASSES)
5097 return;
5098
5101 float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
5102
5103 // calculate diminishing (green in char screen) and non-diminishing (white) contribution
5104 diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1];
5105 nondiminishing = 100.0f * (dodge_base[pclass - 1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1]);
5106}
DBCStorage< GtChanceToMeleeCritEntry > sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt)
@ UNIT_MOD_STAT_START
Definition: Unit.h:170
#define MAX_CLASSES
Definition: SharedDefines.h:155
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:1858
float GetCreateStat(Stats stat) const
Definition: Unit.h:1388
Definition: DBCStructure.h:1057
float ratio
Definition: DBCStructure.h:1058

References BASE_PCT, Unit::getClass(), Unit::GetCreateStat(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, Unit::m_auraModifiersGroup, MAX_CLASSES, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritStore, STAT_AGILITY, and UNIT_MOD_STAT_START.

Referenced by UpdateDodgePercentage().

◆ GetDrunkenstateByValue()

DrunkenState Player::GetDrunkenstateByValue ( uint8  value)
static
960{
961 if (value >= 90)
962 return DRUNKEN_SMASHED;
963 if (value >= 50)
964 return DRUNKEN_DRUNK;
965 if (value)
966 return DRUNKEN_TIPSY;
967 return DRUNKEN_SOBER;
968}
@ DRUNKEN_TIPSY
Definition: Player.h:465
@ DRUNKEN_DRUNK
Definition: Player.h:466
@ DRUNKEN_SOBER
Definition: Player.h:464
@ DRUNKEN_SMASHED
Definition: Player.h:467

References DRUNKEN_DRUNK, DRUNKEN_SMASHED, DRUNKEN_SOBER, and DRUNKEN_TIPSY.

Referenced by Condition::Meets(), AchievementCriteriaData::Meets(), and SetDrunkValue().

◆ GetDrunkValue()

◆ GetDungeonDifficulty()

◆ GetEntryPoint()

WorldLocation const & Player::GetEntryPoint ( ) const
inline

◆ GetExpertiseDodgeOrParryReduction()

float Player::GetExpertiseDodgeOrParryReduction ( WeaponAttackType  attType) const
5147{
5148 switch (attType)
5149 {
5150 case BASE_ATTACK:
5151 return GetUInt32Value(PLAYER_EXPERTISE) / 4.0f;
5152 case OFF_ATTACK:
5154 default:
5155 break;
5156 }
5157 return 0.0f;
5158}
@ PLAYER_EXPERTISE
Definition: UpdateFields.h:349
@ PLAYER_OFFHAND_EXPERTISE
Definition: UpdateFields.h:350

References BASE_ATTACK, Object::GetUInt32Value(), OFF_ATTACK, PLAYER_EXPERTISE, and PLAYER_OFFHAND_EXPERTISE.

◆ GetFakeDrunkValue()

int32 Player::GetFakeDrunkValue ( ) const
inline
@ PLAYER_FAKE_INEBRIATION
Definition: UpdateFields.h:325
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetInt32Value(), and PLAYER_FAKE_INEBRIATION.

Referenced by UpdateInvisibilityDrunkDetect().

◆ GetFarSightDistance()

Optional< float > Player::GetFarSightDistance ( ) const
16230{
16231 return _farSightDistance;
16232}
Optional< float > _farSightDistance
Definition: Player.h:2965

References _farSightDistance.

◆ GetFreeInventorySpace()

uint32 Player::GetFreeInventorySpace ( ) const
490{
491 uint32 freeSpace = 0;
492
493 // Check backpack
494 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
495 {
497 if (!item)
498 freeSpace += 1;
499 }
500
501 // Check bags
503 {
504 if (Bag* bag = GetBagByPos(i))
505 freeSpace += bag->GetFreeSlots();
506 }
507
508 return freeSpace;
509}

References GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::CheckItems().

◆ GetFreePrimaryProfessionPoints()

uint32 Player::GetFreePrimaryProfessionPoints ( ) const
inline

◆ GetFreeTalentPoints()

uint32 Player::GetFreeTalentPoints ( ) const
inline
@ PLAYER_CHARACTER_POINTS1
Definition: UpdateFields.h:342

References Object::GetUInt32Value(), and PLAYER_CHARACTER_POINTS1.

Referenced by BuildPlayerTalentsInfoData(), and LearnTalent().

◆ GetGameObjectIfCanInteractWith()

GameObject * Player::GetGameObjectIfCanInteractWith ( ObjectGuid  guid,
GameobjectTypes  type 
) const
2132{
2133 if (GameObject* go = GetMap()->GetGameObject(guid))
2134 {
2135 if (go->GetGoType() == type)
2136 {
2137 // Players cannot interact with gameobjects that use the "Point" icon
2138 if (go->GetGOInfo()->IconName == "Point")
2139 {
2140 return nullptr;
2141 }
2142
2143 if (go->IsWithinDistInMap(this))
2144 {
2145 return go;
2146 }
2147
2148 LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '{}' [{}] is too far away from player {} [{}] to be used by him (distance={}, maximal 10 is allowed)",
2149 go->GetGOInfo()->name, go->GetGUID().ToString(), GetName(), GetGUID().ToString(), go->GetDistance(this));
2150 }
2151 }
2152 return nullptr;
2153}
GameObject * GetGameObject(uint32 spellId) const
Definition: Unit.cpp:6120

References Unit::GetGameObject(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetName(), LOG_DEBUG, and Position::ToString().

Referenced by CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), and WorldSession::HandleGuildBankerActivate().

◆ GetGlobalCooldownMgr()

GlobalCooldownMgr & Player::GetGlobalCooldownMgr ( )
inline
1781{ return m_GlobalCooldownMgr; }
GlobalCooldownMgr m_GlobalCooldownMgr
Definition: Player.h:2777

References m_GlobalCooldownMgr.

Referenced by Spell::CancelGlobalCooldown(), EquipItem(), Spell::HasGlobalCooldown(), and Spell::TriggerGlobalCooldown().

◆ GetGlyph()

◆ GetGlyphSlot()

uint32 Player::GetGlyphSlot ( uint8  slot) const
inline
@ PLAYER_FIELD_GLYPH_SLOTS_1
Definition: UpdateFields.h:388

References Object::GetUInt32Value(), and PLAYER_FIELD_GLYPH_SLOTS_1.

Referenced by _LoadGlyphAuras(), and Spell::EffectApplyGlyph().

◆ GetGossipTextId() [1/2]

uint32 Player::GetGossipTextId ( uint32  menuId,
WorldObject source 
)
405{
407
408 if (!menuId)
409 return textId;
410
411 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
412
413 for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
414 {
415 if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
416 textId = itr->second.TextID;
417 }
418
419 return textId;
420}
std::pair< GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator > GossipMenusMapBounds
Definition: ObjectMgr.h:631
#define DEFAULT_GOSSIP_MESSAGE
Definition: GossipDef.h:30

References DEFAULT_GOSSIP_MESSAGE, sConditionMgr, and sObjectMgr.

Referenced by GetGossipTextId(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), boss_gloomrel::OnGossipHello(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_zulaman_hostage::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_high_overlord_saurfang_icc::OnGossipHello(), npc_muradin_bronzebeard_icc::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_drake_dealer_hurlunk::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_zephyr::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_engineering_tele_trinket::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_sayge::OnGossipHello(), npc_wormhole::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_experience::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), icecrown_citadel_teleport::OnGossipHello(), npc_prof_blacksmith::SendActionMenu(), npc_prof_alchemy::SendConfirmLearn(), npc_prof_blacksmith::SendConfirmLearn(), npc_prof_tailor::SendConfirmLearn(), go_evil_book_for_dummies::SendConfirmLearn(), npc_prof_alchemy::SendConfirmUnlearn(), npc_prof_blacksmith::SendConfirmUnlearn(), npc_prof_tailor::SendConfirmUnlearn(), go_evil_book_for_dummies::SendConfirmUnlearn(), SendPreparedGossip(), SendPreparedQuest(), npc_echo_of_medivh::sGossipHello(), and npc_chesspiece::sGossipHello().

◆ GetGossipTextId() [2/2]

uint32 Player::GetGossipTextId ( WorldObject source)
397{
398 if (!source)
400
401 return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
402}
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition: PlayerGossip.cpp:422
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition: PlayerGossip.cpp:404

References DEFAULT_GOSSIP_MESSAGE, GetDefaultGossipMenuForSource(), and GetGossipTextId().

◆ GetGracePeriod()

uint32 Player::GetGracePeriod ( uint8  index) const
inline
2485{ return m_runes->runes[index].GracePeriod; }
uint32 GracePeriod
Definition: Player.h:421

References RuneInfo::GracePeriod, m_runes, and Runes::runes.

Referenced by GetRuneBaseCooldown(), and RegenerateAll().

◆ GetGrantableLevels()

uint8 Player::GetGrantableLevels ( )
inline

◆ GetGroup() [1/2]

Group * Player::GetGroup ( )
inline
2444{ return m_group.getTarget(); }
TO * getTarget() const
Definition: Reference.h:95
GroupReference m_group
Definition: Player.h:2857

References Reference< TO, FROM >::getTarget(), and m_group.

Referenced by _LoadGroup(), Group::AddInvite(), Loot::AddItem(), Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), InstanceMap::AddPlayerToMap(), LootItem::AllowedForPlayer(), Group::BroadcastPacket(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), InstanceMap::CannotEnter(), CanRollForItemInLFG(), CanUninviteFromGroup(), Spell::CheckCast(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), CheckInstanceLoginValid(), MapInstanced::CreateInstanceForPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), ArenaTeam::DelMember(), Group::Disband(), WorldSession::DoLootRelease(), DoRandomRoll(), SmartAI::EndPath(), Loot::FillLoot(), GetNextRandomRaidMember(), Unit::GetNextRandomRaidMemberOrPet(), Unit::GetPartyMembers(), ChatHandler::GetPlayerGroupAndGUIDByName(), GetsRecruitAFriendBonus(), GroupEventHappens(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), Unit::HandleAuraRaidProcFromChargeWithValue(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), Unit::HandleDummyAuraProc(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupAssistantLeaderOpcode(), WorldSession::HandleGroupChangeSubGroupOpcode(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupInviteOpcode(), group_commandscript::HandleGroupJoinCommand(), WorldSession::HandleGroupRaidConvertOpcode(), WorldSession::HandleGroupSetLeaderOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleGroupSwapSubGroupOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::HandleInstanceLockResponse(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), WorldSession::HandleLfgLeaveOpcode(), WorldSession::HandleLfgPartyLockInfoRequestOpcode(), WorldSession::HandleLfgSetRolesOpcode(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMethodOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMinimapPingOpcode(), WorldSession::HandlePartyAssignmentOpcode(), WorldSession::HandlePetRename(), Battlefield::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleRaidReadyCheckFinishedOpcode(), WorldSession::HandleRaidReadyCheckOpcode(), WorldSession::HandleRaidTargetUpdateOpcode(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), misc_commandscript::HandleSummonCommand(), tele_commandscript::HandleTeleGroupCommand(), HasQuestForGO(), HasQuestForItem(), isAllowedToLoot(), SmartAI::IsEscortInvokerInRange(), Unit::IsInPartyWith(), IsInSameGroupWith(), IsInSameRaidWith(), GameObject::IsLootAllowedFor(), Creature::isTappedBy(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), npc_coren_direbrew::JustDied(), boss_headless_horseman::JustDied(), boss_ahune::JustDied(), Unit::Kill(), KilledMonsterCredit(), KilledPlayerCredit(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), lfg::LFGMgr::MakeNewGroup(), lfg::LFGPlayerScript::OnBindToInstance(), npc_icc_buff_switcher::OnGossipSelect(), lfg::LFGPlayerScript::OnLevelChanged(), lfg::LFGPlayerScript::OnLogin(), lfg::LFGPlayerScript::OnLogout(), lfg::LFGPlayerScript::OnMapChanged(), Acore::MostHPMissingGroupInRange::operator()(), InstanceMap::PermBindAllPlayers(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerGetDestinationInstanceId(), ProcessDelayedOperations(), RemoveFromGroup(), RemovePet(), RewardPlayerAndGroupAtEvent(), Group::SameSubGroup(), Satisfy(), SendInitialPacketsAfterAddToMap(), SendLoot(), SendNewItem(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendUpdateToOutOfRangeGroupMembers(), Group::SendUpdateToPlayer(), SetBattlegroundOrBattlefieldRaid(), Unit::SetHealth(), Creature::SetLootRecipient(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), Unit::setPowerType(), StoreLootItem(), lfg::LFGMgr::TeleportPlayer(), PetAI::UpdateAllies(), Unit::UpdateAuraForGroup(), UpdatePosition(), lfg::LFGMgr::UpdateRaidBrowser(), UpdateZone(), and GameObject::Use().

◆ GetGroup() [2/2]

const Group * Player::GetGroup ( ) const
inline
2445{ return (const Group*)m_group.getTarget(); }

References Reference< TO, FROM >::getTarget(), and m_group.

◆ GetGroupInvite()

◆ GetGroupRef()

GroupReference & Player::GetGroupRef ( )
inline
2446{ return m_group; }

References m_group.

◆ GetGroupUpdateFlag()

uint32 Player::GetGroupUpdateFlag ( ) const
inline

◆ GetGuild()

Guild * Player::GetGuild ( ) const
15955{
15956 uint32 guildId = GetGuildId();
15957 return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
15958}

References GetGuildId(), and sGuildMgr.

Referenced by GiveLevel(), WorldSession::HandleGuildBankerActivate(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleGuildRankOpcode(), Guild::HandleInviteMember(), and UpdateZone().

◆ GetGuildId()

◆ GetGuildIdInvited()

◆ GetGuildName()

std::string const & Player::GetGuildName ( )
15294{
15295 return sGuildMgr->GetGuildById(GetGuildId())->GetName();
15296}

References GetGuildId(), and sGuildMgr.

◆ GetHealthBonusFromStamina()

float Player::GetHealthBonusFromStamina ( )
277{
278 float stamina = GetStat(STAT_STAMINA);
279
280 float baseStam = stamina < 20 ? stamina : 20;
281 float moreStam = stamina - baseStam;
282
283 return baseStam + (moreStam * 10.0f);
284}

References Unit::GetStat(), and STAT_STAMINA.

Referenced by UpdateMaxHealth().

◆ GetHonorPoints()

◆ GetInGameTime()

uint32 Player::GetInGameTime ( )
inline
1540{ return m_ingametime; }

References m_ingametime.

◆ GetInitialVisiblePackets()

void Player::GetInitialVisiblePackets ( Unit target)
1657{
1658 GetAurasForTarget(target);
1659 if (target->IsAlive())
1660 {
1662 target->GetVictim())
1663 target->SendMeleeAttackStart(target->GetVictim(), this);
1664 }
1665}
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:150
void GetAurasForTarget(Unit *target, bool force=false)
Definition: Player.cpp:12012
Unit * GetVictim() const
Definition: Unit.h:727
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3028

References GetAurasForTarget(), Unit::GetVictim(), Unit::HasUnitState(), Unit::IsAlive(), Unit::SendMeleeAttackStart(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by Acore::VisibleNotifier::SendToSelf(), and UpdateVisibilityOf().

◆ GetInnTriggerId()

uint32 Player::GetInnTriggerId ( ) const
inline
1199{ return _innTriggerId; }

References _innTriggerId.

Referenced by Update().

◆ GetItemByEntry()

Item * Player::GetItemByEntry ( uint32  entry) const
3385{
3386 // in inventory
3388 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3389 if (pItem->GetEntry() == entry)
3390 return pItem;
3391
3393 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3394 if (pItem->GetEntry() == entry)
3395 return pItem;
3396
3397 for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
3398 if (Bag* pBag = GetBagByPos(i))
3399 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
3400 if (Item* pItem = pBag->GetItemByPos(j))
3401 if (pItem->GetEntry() == entry)
3402 return pItem;
3403
3404 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
3405 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3406 if (pItem->GetEntry() == entry)
3407 return pItem;
3408
3409 return nullptr;
3410}

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by Spell::CheckItems(), Spell::EffectRechargeManaGem(), and Spell::EffectStuck().

◆ GetItemByGuid()

Item * Player::GetItemByGuid ( ObjectGuid  guid) const
431{
433 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
434 if (pItem->GetGUID() == guid)
435 return pItem;
436
438 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
439 if (pItem->GetGUID() == guid)
440 return pItem;
441
442 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
443 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
444 if (pItem->GetGUID() == guid)
445 return pItem;
446
448 if (Bag* pBag = GetBagByPos(i))
449 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
450 if (Item* pItem = pBag->GetItemByPos(j))
451 if (pItem->GetGUID() == guid)
452 return pItem;
453
455 if (Bag* pBag = GetBagByPos(i))
456 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
457 if (Item* pItem = pBag->GetItemByPos(j))
458 if (pItem->GetGUID() == guid)
459 return pItem;
460
461 return nullptr;
462}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by _SaveInventory(), Spell::CheckCast(), WorldSession::DoLootRelease(), TradeData::GetItem(), TradeData::GetSpellCastItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleAutostoreLootItemOpcode(), debug_commandscript::HandleDebugGetItemValueCommand(), debug_commandscript::HandleDebugItemExpireCommand(), debug_commandscript::HandleDebugSetItemValueCommand(), Unit::HandleDummyAuraProc(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleItemRefund(), WorldSession::HandleItemRefundInfoRequest(), WorldSession::HandleItemTextQuery(), WorldSession::HandleLootMoneyOpcode(), Unit::HandleOverrideClassScriptAuraProc(), WorldSession::HandlePetitionRenameOpcode(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), SendLoot(), SpellCastTargets::Update(), and Spell::UpdatePointers().

◆ GetItemByPos() [1/2]

Item * Player::GetItemByPos ( uint16  pos) const
465{
466 uint8 bag = pos >> 8;
467 uint8 slot = pos & 255;
468 return GetItemByPos(bag, slot);
469}

References GetItemByPos().

Referenced by _SaveCharacter(), _SaveInventory(), _StoreItem(), AutoUnequipOffhandIfNeed(), BuildEnchantmentsInfoData(), CanEquipItem(), CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanStoreItems(), CanUnequipItem(), CanUnequipItems(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Create(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), DurabilityLossAll(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), DurabilityRepair(), Spell::EffectDurabilityDamage(), Spell::EffectDurabilityDamagePCT(), Spell::EffectEnchantHeldItem(), EnchantmentFitsRequirements(), EquipItem(), EquippedOk(), FindEquipSlot(), GetBagByPos(), GetFreeInventorySpace(), GetItemByEntry(), GetItemByGuid(), GetItemByPos(), GetItemCount(), GetItemCountWithLimitCategory(), GetShield(), GetUseableItemByPos(), GetWeaponForAttack(), misc_commandscript::HandleAddItemCommand(), spell_rog_deadly_poison::HandleAfterHit(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModShapeshift(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), bg_commandscript::HandleBagsClearCommand(), WorldSession::HandleCancelTempEnchantmentOpcode(), character_commandscript::HandleCharacterCheckBagCommand(), debug_commandscript::HandleDebugGetItemStateCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetSave(), WorldSession::HandleEquipmentSetUse(), inventory_commandscript::HandleInventoryCountCommand(), WorldSession::HandleMirrorImageDataRequest(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleReadItem(), WorldSession::HandleSetTradeItemOpcode(), WorldSession::HandleWrapItemOpcode(), HasItemCount(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), HasItemTotemCategory(), IsTwoHandUsed(), MoveItemFromInventory(), RemoveArenaEnchantments(), RemoveItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), SplitItem(), SwapItem(), and ToggleMetaGemsActive().

◆ GetItemByPos() [2/2]

Item * Player::GetItemByPos ( uint8  bag,
uint8  slot 
) const
472{
473 if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END)))
474 return m_items[slot];
475 else if (Bag* pBag = GetBagByPos(bag))
476 return pBag->GetItemByPos(slot);
477 return nullptr;
478}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, KEYRING_SLOT_START, and m_items.

◆ GetItemCount()

uint32 Player::GetItemCount ( uint32  item,
bool  inBankAlso = false,
Item skipItem = nullptr 
) const
351{
352 uint32 count = 0;
354 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
355 if (pItem != skipItem && pItem->GetEntry() == item)
356 count += pItem->GetCount();
357
359 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
360 if (pItem != skipItem && pItem->GetEntry() == item)
361 count += pItem->GetCount();
362
364 if (Bag* pBag = GetBagByPos(i))
365 count += pBag->GetItemCount(item, skipItem);
366
367 if (skipItem && skipItem->GetTemplate()->GemProperties)
369 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
370 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
371 count += pItem->GetGemCountWithID(item);
372
373 if (inBankAlso)
374 {
375 // checking every item from 39 to 74 (including bank bags)
377 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
378 if (pItem != skipItem && pItem->GetEntry() == item)
379 count += pItem->GetCount();
380
382 if (Bag* pBag = GetBagByPos(i))
383 count += pBag->GetItemCount(item, skipItem);
384
385 if (skipItem && skipItem->GetTemplate()->GemProperties)
387 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
388 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
389 count += pItem->GetGemCountWithID(item);
390 }
391
392 return count;
393}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, _Socket::Color, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, KEYRING_SLOT_START, and ItemTemplate::Socket.

Referenced by AdjustQuestReqItemCount(), CanRewardQuest(), CanRollOnItem(), CanTakeMoreSimilarItems(), WorldSession::HandleSetAmmoOpcode(), HasQuestForItem(), npc_venomhide_hatchling::npc_venomhide_hatchlingAI::IsSummonedBy(), ItemRemovedQuestCheck(), npc_adventurous_dwarf::OnGossipHello(), SendNewItem(), and PlayerMenu::SendQuestGiverRequestItems().

◆ GetItemCountWithLimitCategory()

uint32 Player::GetItemCountWithLimitCategory ( uint32  limitCategory,
Item skipItem = nullptr 
) const
396{
397 uint32 count = 0;
398 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
399 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
400 if (pItem != skipItem)
401 if (ItemTemplate const* pProto = pItem->GetTemplate())
402 if (pProto->ItemLimitCategory == limitCategory)
403 count += pItem->GetCount();
404
405 for (int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
406 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
407 if (pItem != skipItem)
408 if (ItemTemplate const* pProto = pItem->GetTemplate())
409 if (pProto->ItemLimitCategory == limitCategory)
410 count += pItem->GetCount();
411
413 if (Bag* pBag = GetBagByPos(i))
414 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
415
416 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
417 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
418 if (pItem != skipItem)
419 if (ItemTemplate const* pProto = pItem->GetTemplate())
420 if (pProto->ItemLimitCategory == limitCategory)
421 count += pItem->GetCount();
422
423 for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
424 if (Bag* pBag = GetBagByPos(i))
425 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
426
427 return count;
428}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by CanTakeMoreSimilarItems().

◆ GetItemFromBuyBackSlot()

Item * Player::GetItemFromBuyBackSlot ( uint32  slot)
4003{
4004 LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = {}", slot);
4005 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
4006 return m_items[slot];
4007 return nullptr;
4008}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, LOG_DEBUG, and m_items.

Referenced by WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ GetItemUpdateQueue()

std::vector< Item * > & Player::GetItemUpdateQueue ( )
inline

◆ GetLastPetNumber()

uint32 Player::GetLastPetNumber ( ) const
inline
2433{ return m_lastpetnumber; }

References m_lastpetnumber.

Referenced by spell_gen_pet_summoned::HandleScript().

◆ GetLastPetSpell()

uint32 Player::GetLastPetSpell ( ) const
inline

◆ GetLastPotionId()

uint32 Player::GetLastPotionId ( )
inline
1788{ return m_lastPotionId; }

References m_lastPotionId.

Referenced by Spell::CheckCast(), and UpdatePotionCooldown().

◆ GetLastUsedRune()

RuneType Player::GetLastUsedRune ( )
inline
2488{ return m_runes->lastUsedRune; }
RuneType lastUsedRune
Definition: Player.h:429

References Runes::lastUsedRune, and m_runes.

◆ GetLevelPlayedTime()

uint32 Player::GetLevelPlayedTime ( )
inline

◆ GetLootGUID()

◆ GetMail()

Mail * Player::GetMail ( uint32  id)
3785{
3786 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
3787 {
3788 if ((*itr)->messageID == id)
3789 {
3790 return (*itr);
3791 }
3792 }
3793 return nullptr;
3794}

References m_mail.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailMarkAsRead(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), and WorldSession::HandleMailTakeMoney().

◆ GetMails()

PlayerMails const & Player::GetMails ( ) const
inline

◆ GetMailSize()

uint32 Player::GetMailSize ( )
inline
1633{ return m_mail.size();}

References m_mail.

Referenced by _SaveMail(), and WorldSession::HandleSendMail().

◆ GetManaBonusFromIntellect()

float Player::GetManaBonusFromIntellect ( )
287{
288 float intellect = GetStat(STAT_INTELLECT);
289
290 float baseInt = intellect < 20 ? intellect : 20;
291 float moreInt = intellect - baseInt;
292
293 return baseInt + (moreInt * 15.0f);
294}

References Unit::GetStat(), and STAT_INTELLECT.

Referenced by UpdateMaxPower().

◆ GetMapRef()

MapReference & Player::GetMapRef ( )
inline
2467{ return m_mapRef; }
MapReference m_mapRef
Definition: Player.h:2912

References m_mapRef.

Referenced by InstanceMap::CannotEnter(), BattlegroundMap::CannotEnter(), ResetMap(), and Map::UpdateIteratorBack().

◆ GetMaxKeyringSize()

uint32 Player::GetMaxKeyringSize ( ) const
inline

◆ GetMaxPersonalArenaRatingRequirement()

uint32 Player::GetMaxPersonalArenaRatingRequirement ( uint32  minarenaslot) const

If trans is specified, arena point save query will be added to trans.

10841{
10842 // returns the maximal personal arena rating that can be used to purchase items requiring this condition
10843 // the personal rating of the arena team must match the required limit as well
10844 // so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
10845 uint32 max_personal_rating = 0;
10846 for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
10847 {
10848 if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
10849 {
10850 uint32 p_rating = GetArenaPersonalRating(i);
10851 uint32 t_rating = at->GetRating();
10852 p_rating = p_rating < t_rating ? p_rating : t_rating;
10853 if (max_personal_rating < p_rating)
10854 max_personal_rating = p_rating;
10855 }
10856 }
10857
10858 sScriptMgr->OnGetMaxPersonalArenaRatingRequirement(this, minarenaslot, max_personal_rating);
10859
10860 return max_personal_rating;
10861}
uint32 GetArenaPersonalRating(uint8 slot) const
Definition: Player.cpp:16151
uint32 GetArenaTeamId(uint8 slot) const
Definition: Player.cpp:16160

References GetArenaPersonalRating(), GetArenaTeamId(), MAX_ARENA_SLOT, sArenaTeamMgr, and sScriptMgr.

Referenced by BuyItemFromVendorSlot().

◆ GetMaxSkillValue()

uint16 Player::GetMaxSkillValue ( uint32  skill) const
5411{
5412 if (!skill)
5413 return 0;
5414
5415 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5416 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5417 return 0;
5418
5419 uint32 bonus = GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos));
5420
5421 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5422 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, false);
5423 result += SKILL_TEMP_BONUS(bonus);
5424 result += SKILL_PERM_BONUS(bonus);
5425 return result < 0 ? 0 : result;
5426}
#define SKILL_TEMP_BONUS(x)
Definition: Player.h:86

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, SKILL_PERM_BONUS, SKILL_TEMP_BONUS, and sScriptMgr.

Referenced by Unit::GetDefenseSkillValue(), and UpdateFishingSkill().

◆ GetMaxSkillValueForLevel()

uint16 Player::GetMaxSkillValueForLevel ( ) const
16188{
16190
16191 sScriptMgr->OnGetMaxSkillValueForLevel(const_cast<Player*>(this), result);
16192
16193 return result;
16194}
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:892

References Unit::GetMaxSkillValueForLevel(), and sScriptMgr.

Referenced by _addSpell(), _LoadSkills(), GetMissPercentageFromDefence(), LearnDefaultSkill(), removeSpell(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDodgePercentage(), UpdateParryPercentage(), and UpdateSkillsForLevel().

◆ getMaxTimer()

int32 Player::getMaxTimer ( MirrorTimerType  timer)
protected
807{
808 switch (timer)
809 {
810 case FATIGUE_TIMER:
811 return MINUTE * IN_MILLISECONDS;
812 case BREATH_TIMER:
813 {
816 int32 UnderWaterTime = sWorld->getIntConfig(CONFIG_WATER_BREATH_TIMER);
818 for (AuraEffectList::const_iterator i = mModWaterBreathing.begin(); i != mModWaterBreathing.end(); ++i)
819 AddPct(UnderWaterTime, (*i)->GetAmount());
820 return UnderWaterTime;
821 }
822 case FIRE_TIMER:
823 {
824 if (!IsAlive())
826 return 2020;
827 }
828 default:
829 return 0;
830 }
831}
@ SPELL_AURA_MOD_WATER_BREATHING
Definition: SpellAuraDefines.h:218
@ SPELL_AURA_WATER_BREATHING
Definition: SpellAuraDefines.h:145
@ FIRE_TIMER
Definition: Player.h:576
@ FATIGUE_TIMER
Definition: Player.h:574
@ BREATH_TIMER
Definition: Player.h:575
@ CONFIG_WATER_BREATH_TIMER
Definition: IWorld.h:422
@ CONFIG_DISABLE_BREATHING
Definition: IWorld.h:311
AccountTypes
Definition: Common.h:55

References AddPct(), BREATH_TIMER, CONFIG_DISABLE_BREATHING, CONFIG_WATER_BREATH_TIMER, DISABLED_MIRROR_TIMER, FATIGUE_TIMER, FIRE_TIMER, Unit::GetAuraEffectsByType(), GetSession(), Unit::HasAuraType(), IN_MILLISECONDS, Unit::IsAlive(), MINUTE, SPELL_AURA_MOD_WATER_BREATHING, SPELL_AURA_WATER_BREATHING, and sWorld.

Referenced by HandleDrowning(), and IsMirrorTimerActive().

◆ GetMeleeCritFromAgility()

float Player::GetMeleeCritFromAgility ( )
5039{
5040 uint8 level = GetLevel();
5041 uint32 pclass = getClass();
5042
5043 if (level > GT_MAX_LEVEL)
5044 level = GT_MAX_LEVEL;
5045
5046 GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass - 1);
5047 GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5048 if (!critBase || !critRatio)
5049 return 0.0f;
5050
5051 float crit = critBase->base + GetStat(STAT_AGILITY) * critRatio->ratio;
5052 return crit * 100.0f;
5053}
DBCStorage< GtChanceToMeleeCritBaseEntry > sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt)
Definition: DBCStructure.h:1052
float base
Definition: DBCStructure.h:1053

References GtChanceToMeleeCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritBaseStore, sGtChanceToMeleeCritStore, and STAT_AGILITY.

Referenced by UpdateAllCritPercentages().

◆ GetMeleeDamageSchoolMask()

SpellSchoolMask Player::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
overridevirtual

Implements Unit.

6939{
6940 if (Item const* weapon = GetWeaponForAttack(attackType, true))
6941 {
6942 return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType);
6943 }
6944
6946}
SpellSchoolMask
Definition: SharedDefines.h:295

References GetWeaponForAttack(), and SPELL_SCHOOL_MASK_NORMAL.

◆ GetMissPercentageFromDefence()

float Player::GetMissPercentageFromDefence ( ) const
709{
710 float const miss_cap[MAX_CLASSES] =
711 {
712 16.00f, // Warrior //correct
713 16.00f, // Paladin //correct
714 16.00f, // Hunter //?
715 16.00f, // Rogue //?
716 16.00f, // Priest //?
717 16.00f, // DK //correct
718 16.00f, // Shaman //?
719 16.00f, // Mage //?
720 16.00f, // Warlock //?
721 0.0f, // ??
722 16.00f // Druid //?
723 };
724
725 float diminishing = 0.0f, nondiminishing = 0.0f;
726 // Modify value from defense skill (only bonus from defense rating diminishes)
727 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
728 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
729
730 // apply diminishing formula to diminishing miss chance
731 uint32 pclass = getClass() - 1;
732 return nondiminishing + (diminishing * miss_cap[pclass] / (diminishing + miss_cap[pclass] * m_diminishing_k[pclass]));
733}
const float m_diminishing_k[MAX_CLASSES]
Definition: StatSystem.cpp:693
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5141

References CR_DEFENSE_SKILL, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), m_diminishing_k, MAX_CLASSES, and SKILL_DEFENSE.

◆ GetMItem()

Item * Player::GetMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1652 {
1653 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
1654 return itr != mMitems.end() ? itr->second : nullptr;
1655 }

References mMitems.

Referenced by WorldSession::HandleGetMailList(), WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ GetMoney()

◆ GetMostPointsTalentTree()

uint8 Player::GetMostPointsTalentTree ( ) const
15253{
15254 uint32 specPoints[3] = {0, 0, 0};
15255 const PlayerTalentMap& talentMap = GetTalentMap();
15256 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15257 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15258 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15259 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15260 if (tab->tabpage < 3)
15261 {
15262 // find current talent rank
15263 uint8 currentTalentRank = 0;
15264 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15265 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15266 {
15267 currentTalentRank = rank + 1;
15268 break;
15269 }
15270 specPoints[tab->tabpage] += currentTalentRank;
15271 }
15272 uint8 maxIndex = 0;
15273 uint8 maxCount = specPoints[0];
15274 for (uint8 i = 1; i < 3; ++i)
15275 if (specPoints[i] > maxCount)
15276 {
15277 maxIndex = i;
15278 maxCount = specPoints[i];
15279 }
15280 return maxIndex;
15281}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

◆ GetMountBlockId()

uint32 Player::GetMountBlockId ( )
inline

◆ GetNextQuest()

Quest const * Player::GetNextQuest ( ObjectGuid  guid,
Quest const *  quest 
)
208{
209 QuestRelationBounds objectQR;
210
212 if (creature)
213 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
214 else
215 {
216 //we should obtain map pointer from GetMap() in 99% of cases. Special case
217 //only for quests which cast teleport spells on player
219 ASSERT(_map);
220 GameObject* pGameObject = _map->GetGameObject(guid);
221 if (pGameObject)
222 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
223 else
224 return nullptr;
225 }
226
227 uint32 nextQuestID = quest->GetNextQuestInChain();
228 for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr)
229 {
230 if (itr->second == nextQuestID)
231 return sObjectMgr->GetQuestTemplate(nextQuestID);
232 }
233
234 return nullptr;
235}
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
Definition: ObjectMgr.h:525
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:237

References ASSERT, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), Quest::GetNextQuestInChain(), Object::IsInWorld(), sMapMgr, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ GetNextRandomRaidMember()

Player * Player::GetNextRandomRaidMember ( float  radius)
12932{
12933 Group* group = GetGroup();
12934 if (!group)
12935 return nullptr;
12936
12937 std::vector<Player*> nearMembers;
12938 nearMembers.reserve(group->GetMembersCount());
12939
12940 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12941 {
12942 Player* Target = itr->GetSource();
12943
12944 // IsHostileTo check duel and controlled by enemy
12945 if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
12946 !Target->HasInvisibilityAura() && !IsHostileTo(Target))
12947 nearMembers.push_back(Target);
12948 }
12949
12950 if (nearMembers.empty())
12951 return nullptr;
12952
12953 uint32 randTarget = urand(0, nearMembers.size() - 1);
12954 return nearMembers[randTarget];
12955}
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10178

References Group::GetFirstMember(), GetGroup(), Group::GetMembersCount(), Unit::HasInvisibilityAura(), Unit::IsHostileTo(), WorldObject::IsWithinDistInMap(), GroupReference::next(), and urand().

◆ GetNextSave()

uint32 Player::GetNextSave ( ) const
inline
2587{ return m_nextSave; }

References m_nextSave.

◆ GetNPCIfCanInteractWith()

Creature * Player::GetNPCIfCanInteractWith ( ObjectGuid  guid,
uint32  npcflagmask 
)
2075{
2076 // unit checks
2077 if (!guid)
2078 return nullptr;
2079
2080 if (!IsInWorld())
2081 return nullptr;
2082
2083 if (IsInFlight())
2084 return nullptr;
2085
2086 // exist (we need look pets also for some interaction (quest/etc)
2087 Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
2088 if (!creature)
2089 return nullptr;
2090
2091 // Deathstate checks
2093 return nullptr;
2094
2095 // alive or spirit healer
2097 return nullptr;
2098
2099 // appropriate npc type
2100 if (npcflagmask && !creature->HasNpcFlag(NPCFlags(npcflagmask)))
2101 return nullptr;
2102
2103 // not allow interaction under control, but allow with own pets
2104 if (creature->GetCharmerGUID())
2105 return nullptr;
2106
2107 // xinef: perform better check
2108 if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)
2109 return nullptr;
2110
2111 // xinef: not needed, CORRECTLY checked above including forced reputations etc
2112 // not unfriendly
2113 //if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->GetFaction()))
2114 // if (factionTemplate->faction)
2115 // if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
2116 // if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
2117 // return nullptr;
2118
2119 // not too far
2120 if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
2121 return nullptr;
2122
2123 // pussywizard: many npcs have missing conditions for class training and rogue trainer can for eg. train dual wield to a shaman :/ too many to change in sql and watch in the future
2124 // pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
2126 return nullptr;
2127
2128 return creature;
2129}
#define INTERACTION_DISTANCE
Definition: ObjectDefines.h:24
@ CLASS_CONTEXT_CLASS_TRAINER
Definition: UnitDefines.h:222
NPCFlags
Non Player Character flags.
Definition: UnitDefines.h:292
@ UNIT_NPC_FLAG_TRAINER_CLASS
Definition: UnitDefines.h:299
@ UNIT_NPC_FLAG_TRAINER
Definition: UnitDefines.h:298
Classes
Definition: SharedDefines.h:139
@ REP_UNFRIENDLY
Definition: SharedDefines.h:182
@ TRAINER_TYPE_CLASS
Definition: SharedDefines.h:2617
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
Definition: SharedDefines.h:2696
@ CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD
Definition: SharedDefines.h:2702
uint32 trainer_class
Definition: CreatureData.h:223
uint32 type_flags
Definition: CreatureData.h:226
uint32 trainer_type
Definition: CreatureData.h:221
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10006
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:991
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:1163

References CLASS_CONTEXT_CLASS_TRAINER, CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD, CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS, Unit::GetCharmerGUID(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Creature::GetCreatureTemplate(), Unit::GetReactionTo(), Unit::HasNpcFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), IsClass(), Unit::IsInFlight(), Object::IsInWorld(), WorldObject::IsWithinDistInMap(), REP_UNFRIENDLY, CreatureTemplate::trainer_class, CreatureTemplate::trainer_type, TRAINER_TYPE_CLASS, CreatureTemplate::type_flags, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_TRAINER_CLASS.

Referenced by BuyItemFromVendorSlot(), CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), WorldSession::CanUseBank(), AuctionListItemsDelayEvent::Execute(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::SendListInventory(), WorldSession::SendPetitionShowList(), and WorldSession::SendTrainerList().

◆ GetOriginalGroup()

◆ GetOriginalGroupRef()

GroupReference & Player::GetOriginalGroupRef ( )
inline
2460{ return m_originalGroup; }

References m_originalGroup.

◆ GetOriginalSubGroup()

uint8 Player::GetOriginalSubGroup ( ) const
inline
2461{ return m_originalGroup.getSubGroup(); }
uint8 getSubGroup() const
Definition: GroupReference.h:38

References GroupReference::getSubGroup(), and m_originalGroup.

Referenced by RemoveFromBattlegroundOrBattlefieldRaid().

◆ GetOrInitPetStable()

PetStable & Player::GetOrInitPetStable ( )
15533{
15534 if (!m_petStable)
15535 m_petStable = std::make_unique<PetStable>();
15536
15537 return *m_petStable;
15538}

References m_petStable.

Referenced by WorldSession::HandleBuyStableSlot(), Unit::InitTamedPet(), and SummonPet().

◆ GetOutdoorPvP()

OutdoorPvP * Player::GetOutdoorPvP ( ) const
12458{
12459 return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(GetZoneId());
12460}
#define sOutdoorPvPMgr
Definition: OutdoorPvPMgr.h:103

References WorldObject::GetZoneId(), and sOutdoorPvPMgr.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Unit::Kill().

◆ GetPassOnGroupLoot()

bool Player::GetPassOnGroupLoot ( ) const
inline
2465{ return m_bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by Group::GroupLoot(), and Group::NeedBeforeGreed().

◆ GetPendingBind()

uint32 Player::GetPendingBind ( ) const
inline
2416{ return _pendingBindId; }

References _pendingBindId.

Referenced by WorldSession::HandleInstanceLockResponse().

◆ GetPendingSpectatorInviteInstanceId()

uint32 Player::GetPendingSpectatorInviteInstanceId ( ) const
inline

◆ GetPet()

Pet * Player::GetPet ( ) const
8863{
8864 if (ObjectGuid pet_guid = GetPetGUID())
8865 {
8866 if (!pet_guid.IsPet())
8867 return nullptr;
8868
8869 Pet* pet = ObjectAccessor::GetPet(*this, pet_guid);
8870
8871 if (!pet)
8872 return nullptr;
8873
8874 if (IsInWorld())
8875 return pet;
8876
8877 //there may be a guardian in slot
8878 //LOG_ERROR("entities.player", "Player::GetPet: Pet {} not exist.", pet_guid.ToString());
8879 //const_cast<Player*>(this)->SetPetGUID(0);
8880 }
8881
8882 return nullptr;
8883}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:218

References ObjectAccessor::GetPet(), Unit::GetPetGUID(), and Object::IsInWorld().

Referenced by Spell::_cast(), KillRewarder::_RewardXP(), ActivateSpec(), Battleground::AddPlayer(), AuraEffect::ApplySpellMod(), WorldSession::BuildPartyMemberStatsChangedPacket(), BuildPetTalentsInfoData(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), Unit::DealDamage(), spell_hun_masters_call::DoCheckCast(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::EffectFeedPet(), Spell::EffectResurrectPet(), Spell::EffectSummonPet(), GiveLevel(), AuraEffect::HandleAuraModPetTalentsPoints(), spell_hun_masters_call::HandleDummy(), learn_commandscript::HandleLearnAllMyPetTalentsCommand(), AuraEffect::HandleModPossessPet(), WorldSession::HandleMoveTeleportAck(), pet_commandscript::HandlePetLearnCommand(), pet_commandscript::HandlePetUnlearnCommand(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRequestPartyMemberStatsOpcode(), WorldSession::HandleRequestPetInfo(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), InitStatsForLevel(), Unit::Kill(), LearnPetTalent(), Pet::LoadPetFromDB(), go_orb_of_domination::OnGossipHello(), PetSpellInitialize(), PrepareGossipMenu(), RemoveArenaSpellCooldowns(), RemovePet(), ResetPetTalents(), SaveToDB(), SendUpdateToOutOfRangeGroupMembers(), SetGameMaster(), Unit::SetSpeed(), TeleportTo(), UnsummonPetTemporaryIfAny(), and Update().

◆ GetPetStable() [1/2]

◆ GetPetStable() [2/2]

PetStable const * Player::GetPetStable ( ) const
inline
1203{ return m_petStable.get(); }

References m_petStable.

◆ GetPhaseMaskForSpawn()

uint32 Player::GetPhaseMaskForSpawn ( ) const
13718{
13720
13721 if (!phase)
13723
13724 // some aura phases include 1 normal map in addition to phase itself
13725 uint32 n_phase = phase & ~PHASEMASK_NORMAL;
13726 if (n_phase > 0)
13727 return n_phase;
13728
13729 return phase;
13730}
@ PHASEMASK_NORMAL
Definition: Object.h:59
phase
Definition: boss_skadi.cpp:103
uint32 GetPhaseMask() const
Definition: Object.h:444
uint32 GetPhaseByAuras() const
Definition: Unit.cpp:18955

References Unit::GetPhaseByAuras(), WorldObject::GetPhaseMask(), IsGameMaster(), and PHASEMASK_NORMAL.

Referenced by gobject_commandscript::HandleGameObjectAddCommand(), npc_commandscript::HandleNpcAddCommand(), wp_commandscript::HandleWpModifyCommand(), and wp_commandscript::HandleWpShowCommand().

◆ GetPlayerFlags()

PlayerFlags Player::GetPlayerFlags ( ) const
inline
@ PLAYER_FLAGS
Definition: UpdateFields.h:178
PlayerFlags
Definition: Player.h:473

References Object::GetUInt32Value(), and PLAYER_FLAGS.

Referenced by _SaveCharacter().

◆ GetPlayerName()

std::string Player::GetPlayerName ( )
16246{
16247 std::string name = GetName();
16248 std::string color = "";
16249
16250 switch (getClass())
16251 {
16252 case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break;
16253 case CLASS_DRUID: color = "|cffFF7D0A"; break;
16254 case CLASS_HUNTER: color = "|cffABD473"; break;
16255 case CLASS_MAGE: color = "|cff69CCF0"; break;
16256 case CLASS_PALADIN: color = "|cffF58CBA"; break;
16257 case CLASS_PRIEST: color = "|cffFFFFFF"; break;
16258 case CLASS_ROGUE: color = "|cffFFF569"; break;
16259 case CLASS_SHAMAN: color = "|cff0070DE"; break;
16260 case CLASS_WARLOCK: color = "|cff9482C9"; break;
16261 case CLASS_WARRIOR: color = "|cffC79C6E"; break;
16262 }
16263
16264 return "|Hplayer:" + name + "|h" + color + name + "|h|r";
16265}
@ CLASS_PRIEST
Definition: SharedDefines.h:145

References CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, Unit::getClass(), and WorldObject::GetName().

Referenced by gear_commandscript::HandleGearStatsCommand().

◆ GetPlayerSetting()

PlayerSetting Player::GetPlayerSetting ( std::string  source,
uint8  index 
)
71{
72 auto itr = m_charSettingsMap.find(source);
73
74 if (itr == m_charSettingsMap.end())
75 {
76 // Settings not found, this will initialize a new entry.
77 UpdatePlayerSetting(source, index, 0);
78 return GetPlayerSetting(source, index);
79 }
80
81 PlayerSettingVector settingVector = itr->second;
82 if (settingVector.size() < (uint8)(index + 1))
83 {
84 UpdatePlayerSetting(source, index, 0);
85 return GetPlayerSetting(source, index);
86 }
87
88 return itr->second[index];
89}
void UpdatePlayerSetting(std::string source, uint8 index, uint32 value)
Definition: PlayerSettings.cpp:115
PlayerSetting GetPlayerSetting(std::string source, uint8 index)
Definition: PlayerSettings.cpp:70

References GetPlayerSetting(), m_charSettingsMap, and UpdatePlayerSetting().

Referenced by GetPlayerSetting(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), and ChatHandler::SendWorldTextOptional().

◆ GetPureMaxSkillValue()

uint16 Player::GetPureMaxSkillValue ( uint32  skill) const
5429{
5430 if (!skill)
5431 return 0;
5432
5433 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5434 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5435 return 0;
5436
5437 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5438
5439 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, true);
5440
5441 return result < 0 ? 0 : result;
5442}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, and sScriptMgr.

Referenced by _addSpell(), learn_commandscript::HandleLearnAllRecipesCommand(), lookup_commandscript::HandleLookupSkillCommand(), misc_commandscript::HandleSetSkillCommand(), and removeSpell().

◆ GetPureSkillValue()

uint16 Player::GetPureSkillValue ( uint32  skill) const

◆ GetQuestDialogStatus()

QuestGiverStatus Player::GetQuestDialogStatus ( Object questGiver)
1590{
1593
1594 sScriptMgr->GetDialogStatus(this, questgiver);
1595
1596 switch (questgiver->GetTypeId())
1597 {
1598 case TYPEID_GAMEOBJECT:
1599 {
1600 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
1601 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1602 return questStatus;
1603 qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
1604 qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry());
1605 break;
1606 }
1607 case TYPEID_UNIT:
1608 {
1609 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
1610 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1611 return questStatus;
1612 qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
1613 qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry());
1614 break;
1615 }
1616 default:
1617 // it's impossible, but check
1618 //LOG_ERROR("entities.player.quest", "GetQuestDialogStatus called for unexpected type {}", questgiver->GetTypeId());
1619 return DIALOG_STATUS_NONE;
1620 }
1621
1623
1624 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
1625 {
1627 uint32 questId = i->second;
1628 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1629 if (!quest)
1630 continue;
1631
1632 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1633 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1634 continue;
1635
1636 QuestStatus status = GetQuestStatus(questId);
1637 if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId))
1638 {
1639 result2 = DIALOG_STATUS_REWARD;
1640 }
1641 else if (status == QUEST_STATUS_INCOMPLETE)
1642 {
1643 result2 = DIALOG_STATUS_INCOMPLETE;
1644 }
1645
1646 if (quest->IsAutoComplete() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
1647 {
1648 result2 = DIALOG_STATUS_REWARD_REP;
1649 }
1650
1651 if (result2 > result)
1652 {
1653 result = result2;
1654 }
1655 }
1656
1657 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
1658 {
1660 uint32 questId = i->second;
1661 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1662 if (!quest)
1663 continue;
1664
1665 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1666 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1667 continue;
1668
1669 QuestStatus status = GetQuestStatus(questId);
1670 if (status == QUEST_STATUS_NONE)
1671 {
1672 if (CanSeeStartQuest(quest))
1673 {
1674 if (SatisfyQuestLevel(quest, false))
1675 {
1676 bool isNotLowLevelQuest = GetLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
1677
1678 if (quest->IsRepeatable())
1679 {
1680 if (quest->IsDaily())
1681 {
1682 if (isNotLowLevelQuest)
1683 {
1685 }
1686 else
1687 {
1689 }
1690 }
1691 else if (quest->IsWeekly() || quest->IsMonthly())
1692 {
1693 if (isNotLowLevelQuest)
1694 {
1695 result2 = DIALOG_STATUS_AVAILABLE;
1696 }
1697 else
1698 {
1700 }
1701 }
1702 else if (quest->IsAutoComplete())
1703 {
1704 if (isNotLowLevelQuest)
1705 {
1706 result2 = DIALOG_STATUS_REWARD_REP;
1707 }
1708 else
1709 {
1711 }
1712 }
1713 else
1714 {
1715 if (isNotLowLevelQuest)
1716 {
1717 result2 = DIALOG_STATUS_REWARD_REP;
1718 }
1719 else
1720 {
1722 }
1723 }
1724 }
1725 else
1726 {
1727 result2 = isNotLowLevelQuest ? DIALOG_STATUS_AVAILABLE : DIALOG_STATUS_LOW_LEVEL_AVAILABLE;
1728 }
1729 }
1730 else
1731 {
1732 result2 = DIALOG_STATUS_UNAVAILABLE;
1733 }
1734 }
1735 }
1736
1737 if (result2 > result)
1738 result = result2;
1739 }
1740
1741 return result;
1742}
QuestGiverStatus
Definition: QuestDef.h:111
@ DIALOG_STATUS_UNAVAILABLE
Definition: QuestDef.h:113
@ DIALOG_STATUS_NONE
Definition: QuestDef.h:112
@ DIALOG_STATUS_AVAILABLE
Definition: QuestDef.h:120
@ DIALOG_STATUS_SCRIPTED_NO_STATUS
Definition: QuestDef.h:125
@ DIALOG_STATUS_LOW_LEVEL_REWARD_REP
Definition: QuestDef.h:115
@ DIALOG_STATUS_REWARD
Definition: QuestDef.h:122
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE
Definition: QuestDef.h:114
@ DIALOG_STATUS_REWARD_REP
Definition: QuestDef.h:118
@ DIALOG_STATUS_INCOMPLETE
Definition: QuestDef.h:117
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP
Definition: QuestDef.h:116
@ DIALOG_STATUS_AVAILABLE_REP
Definition: QuestDef.h:119
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition: ConditionMgr.h:141
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition: IWorld.h:291
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.h:1414
bool CanSeeStartQuest(Quest const *quest)
Definition: PlayerQuest.cpp:237
uint32 GetQuestId() const
Definition: QuestDef.h:227
bool IsDaily() const
Definition: QuestDef.h:286
bool IsWeekly() const
Definition: QuestDef.h:287
bool IsDailyOrWeekly() const
Definition: QuestDef.h:290
bool IsMonthly() const
Definition: QuestDef.h:288

References CanSeeStartQuest(), CanTakeQuest(), CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, DIALOG_STATUS_AVAILABLE, DIALOG_STATUS_AVAILABLE_REP, DIALOG_STATUS_INCOMPLETE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP, DIALOG_STATUS_LOW_LEVEL_REWARD_REP, DIALOG_STATUS_NONE, DIALOG_STATUS_REWARD, DIALOG_STATUS_REWARD_REP, DIALOG_STATUS_SCRIPTED_NO_STATUS, DIALOG_STATUS_UNAVAILABLE, Object::GetEntry(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), GetQuestRewardStatus(), GetQuestStatus(), Object::GetTypeId(), Quest::IsAutoComplete(), Quest::IsDaily(), Quest::IsDailyOrWeekly(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SatisfyQuestLevel(), sConditionMgr, sObjectMgr, sScriptMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GameObject::ActivateToQuest(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), and SendQuestGiverStatusMultiple().

◆ GetQuestLevel()

int32 Player::GetQuestLevel ( Quest const *  quest) const
inline

◆ GetQuestRate()

float Player::GetQuestRate ( bool  isDFQuest = false)
16197{
16198 float result = isDFQuest ? sWorld->getRate(RATE_XP_QUEST_DF) : sWorld->getRate(RATE_XP_QUEST);
16199
16200 sScriptMgr->OnGetQuestRate(this, result);
16201
16202 return result;
16203}
@ RATE_XP_QUEST_DF
Definition: IWorld.h:477
@ RATE_XP_QUEST
Definition: IWorld.h:476

References RATE_XP_QUEST, RATE_XP_QUEST_DF, sScriptMgr, and sWorld.

Referenced by CalculateQuestRewardXP().

◆ GetQuestRewardStatus()

◆ GetQuestSlotCounter()

uint16 Player::GetQuestSlotCounter ( uint16  slot,
uint8  counter 
) const
inline
1475{ return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
@ PLAYER_QUEST_LOG_1_1
Definition: UpdateFields.h:186
@ QUEST_COUNTS_OFFSET
Definition: Player.h:624
#define MAX_QUEST_OFFSET
Definition: Player.h:628

References Object::GetUInt64Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and QUEST_COUNTS_OFFSET.

Referenced by SendQuestUpdateAddCreatureOrGo(), and SendQuestUpdateAddPlayer().

◆ GetQuestSlotQuestId()

◆ GetQuestSlotState()

uint32 Player::GetQuestSlotState ( uint16  slot) const
inline

◆ GetQuestSlotTime()

uint32 Player::GetQuestSlotTime ( uint16  slot) const
inline

◆ GetQuestStatus()

QuestStatus Player::GetQuestStatus ( uint32  quest_id) const
1425{
1426 if (quest_id)
1427 {
1428 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1429
1430 if (itr != m_QuestStatus.end())
1431 {
1432 return itr->second.Status;
1433 }
1434
1435 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
1436 {
1437 if (qInfo->IsSeasonal())
1438 {
1440 }
1441
1442 if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
1443 {
1444 return QUEST_STATUS_REWARDED;
1445 }
1446 }
1447 }
1448
1449 return QUEST_STATUS_NONE;
1450}
@ QUEST_STATUS_REWARDED
Definition: QuestDef.h:106

References IsQuestRewarded(), m_QuestStatus, QUEST_STATUS_NONE, QUEST_STATUS_REWARDED, SatisfyQuestSeasonal(), and sObjectMgr.

Referenced by GameObject::ActivateToQuest(), LootItem::AllowedForPlayer(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::AttackStart(), CanRewardQuest(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), spell_item_demon_broiled_surprise::CheckRequirement(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), DuelComplete(), Spell::EffectQuestClear(), Spell::EffectScriptEffect(), SmartAI::EndPath(), FailQuest(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), go_gilded_brazier::go_gilded_brazierAI::GossipHello(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), WorldSession::HandleAreaTriggerOpcode(), spell_midsummer_torch_catch::HandleDummy(), spell_q12014_steady_as_a_rock::HandleFinish(), spell_sindragosa_frost_breath::HandleInfusion(), lookup_commandscript::HandleLookupQuestCommand(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverRequestRewardOpcode(), spell_q11322_q11317_the_cleansing::if(), SpellArea::IsFitToRequirements(), npc_kservant::npc_kservantAI::IsSummonedBy(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_alar::JustDied(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), npc_a_special_surprise::npc_a_special_surpriseAI::MeetQuestCondition(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), npc_black_knight_graveyard::npc_black_knight_graveyardAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_rizzle_sprysprocket::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_great_bear_spirit::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_plucky::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_iruk::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_tele_to_violet_stand::OnGossipHello(), go_ravager_cage::OnGossipHello(), go_bristlelimb_cage::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_skull_pile::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_table_theka::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_amberpine_outhouse::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_great_bear_spirit::OnGossipSelect(), at_ancient_leaf::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), at_malfurion_stormrage::OnTrigger(), at_commander_dawnforge::OnTrigger(), item_captured_frog::OnUse(), npc_doctor::npc_doctorAI::PatientDied(), npc_doctor::npc_doctorAI::PatientSaved(), PrepareQuestMenu(), NPCStaveQuestAI::QuestIncomplete(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), SatisfyQuestExclusiveGroup(), SatisfyQuestNextChain(), SatisfyQuestPreviousQuest(), SatisfyQuestStatus(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), npc_costumed_orphan_matron::sGossipHello(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), Battleground::SpiritOfCompetitionEvent(), npc_clintar_spirit::npc_clintar_spiritAI::StartEvent(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), and GameObject::Use().

◆ getQuestStatusMap()

◆ GetQuestStatusSaveMap()

QuestStatusSaveMap & Player::GetQuestStatusSaveMap ( )
inline
1611{ return m_QuestStatusSave; }

References m_QuestStatusSave.

◆ GetRaidDifficulty()

◆ GetRandomWinner()

bool Player::GetRandomWinner ( )
inline

◆ GetRank()

uint8 Player::GetRank ( ) const
inline

◆ GetRatingBonusValue()

◆ GetRatingMultiplier()

float Player::GetRatingMultiplier ( CombatRating  cr) const
5126{
5127 uint8 level = GetLevel();
5128
5129 if (level > GT_MAX_LEVEL)
5130 level = GT_MAX_LEVEL;
5131
5132 GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr * GT_MAX_LEVEL + level - 1);
5133 // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1
5134 GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass() - 1) * GT_MAX_RATING + cr + 1);
5135 if (!Rating || !classRating)
5136 return 1.0f; // By default use minimum coefficient (not must be called)
5137
5138 return classRating->ratio / Rating->ratio;
5139}
DBCStorage< GtCombatRatingsEntry > sGtCombatRatingsStore(GtCombatRatingsfmt)
DBCStorage< GtOCTClassCombatRatingScalarEntry > sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt)
#define GT_MAX_RATING
Definition: DBCStructure.h:1039
Definition: DBCStructure.h:1047
float ratio
Definition: DBCStructure.h:1048
Definition: DBCStructure.h:1077
float ratio
Definition: DBCStructure.h:1078

References Unit::getClass(), Unit::GetLevel(), GT_MAX_LEVEL, GT_MAX_RATING, GtCombatRatingsEntry::ratio, GtOCTClassCombatRatingScalarEntry::ratio, sGtCombatRatingsStore, and sGtOCTClassCombatRatingScalarStore.

Referenced by ApplyRatingMod(), and GetRatingBonusValue().

◆ GetRealDodge()

float Player::GetRealDodge ( ) const
inline
2584{ return m_realDodge; }

References m_realDodge.

Referenced by Unit::GetUnitDodgeChance().

◆ GetRealParry()

float Player::GetRealParry ( ) const
inline
2583{ return m_realParry; }

References m_realParry.

◆ GetReputation()

uint32 Player::GetReputation ( uint32  factionentry) const
15289{
15290 return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
15291}
int32 GetReputation(uint32 faction_id) const
Definition: ReputationMgr.cpp:78

References ReputationMgr::GetReputation(), GetReputationMgr(), and sFactionStore.

Referenced by CanCompleteQuest(), ReputationChanged(), ReputationChanged2(), and SatisfyQuestReputation().

◆ GetReputationMgr() [1/2]

◆ GetReputationMgr() [2/2]

ReputationMgr const & Player::GetReputationMgr ( ) const
inline
2102{ return *m_reputationMgr; }

References m_reputationMgr.

◆ GetReputationPriceDiscount() [1/2]

◆ GetReputationPriceDiscount() [2/2]

float Player::GetReputationPriceDiscount ( FactionTemplateEntry const *  factionTemplate) const
12294{
12295 if (!factionTemplate || !factionTemplate->faction)
12296 {
12297 return 1.0f;
12298 }
12299
12300 ReputationRank rank = GetReputationRank(factionTemplate->faction);
12301 if (rank <= REP_NEUTRAL)
12302 {
12303 return 1.0f;
12304 }
12305
12306 return 1.0f - 0.05f * (rank - REP_NEUTRAL);
12307}
ReputationRank
Definition: SharedDefines.h:179
@ REP_NEUTRAL
Definition: SharedDefines.h:183

References FactionTemplateEntry::faction, GetReputationRank(), and REP_NEUTRAL.

◆ GetReputationRank()

◆ GetReqKillOrCastCurrentCount()

uint16 Player::GetReqKillOrCastCurrentCount ( uint32  quest_id,
int32  entry 
)
1746{
1747 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1748 if (!qInfo)
1749 return 0;
1750
1751 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1752 if (qInfo->RequiredNpcOrGo[j] == entry)
1753 return m_QuestStatus[quest_id].CreatureOrGOCount[j];
1754
1755 return 0;
1756}

References m_QuestStatus, QUEST_OBJECTIVES_COUNT, Quest::RequiredNpcOrGo, and sObjectMgr.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), and npc_razael_and_lyana::OnGossipHello().

◆ GetRestBonus()

float Player::GetRestBonus ( ) const
inline
1193{ return _restBonus; }

References _restBonus.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ GetResurrectionSpellId()

uint32 Player::GetResurrectionSpellId ( )
12557{
12558 // search priceless resurrection possibilities
12559 uint32 prio = 0;
12560 uint32 spell_id = 0;
12562 for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
12563 {
12564 // Soulstone Resurrection // prio: 3 (max, non death persistent)
12565 if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92)
12566 {
12567 switch ((*itr)->GetId())
12568 {
12569 case 20707:
12570 spell_id = 3026;
12571 break; // rank 1
12572 case 20762:
12573 spell_id = 20758;
12574 break; // rank 2
12575 case 20763:
12576 spell_id = 20759;
12577 break; // rank 3
12578 case 20764:
12579 spell_id = 20760;
12580 break; // rank 4
12581 case 20765:
12582 spell_id = 20761;
12583 break; // rank 5
12584 case 27239:
12585 spell_id = 27240;
12586 break; // rank 6
12587 case 47883:
12588 spell_id = 47882;
12589 break; // rank 7
12590 default:
12591 LOG_ERROR("entities.player", "Unhandled spell {}: S.Resurrection", (*itr)->GetId());
12592 continue;
12593 }
12594
12595 prio = 3;
12596 }
12597 // Twisting Nether // prio: 2 (max)
12598 else if ((*itr)->GetId() == 23701 && roll_chance_i(10))
12599 {
12600 prio = 2;
12601 spell_id = 23700;
12602 }
12603 }
12604
12605 // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life
12606 if (prio < 1 && HasSpell(20608) && !HasSpellCooldown(21169) && (HasAura(58059) || HasItemCount(17030)))
12607 spell_id = 21169;
12608
12609 return spell_id;
12610}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67
bool roll_chance_i(int chance)
Definition: Random.h:59

References Unit::GetAuraEffectsByType(), Unit::HasAura(), HasItemCount(), HasSpell(), HasSpellCooldown(), LOG_ERROR, roll_chance_i(), and SPELL_AURA_DUMMY.

Referenced by Unit::Kill(), and setDeathState().

◆ GetRewardedQuestCount()

std::size_t Player::GetRewardedQuestCount ( ) const
inline
1613{ return m_RewardedQuests.size(); }

References m_RewardedQuests.

Referenced by WorldSession::HandleQueryQuestsCompleted().

◆ getRewardedQuests()

RewardedQuestSet const & Player::getRewardedQuests ( ) const
inline

◆ GetRuneBaseCooldown()

uint32 Player::GetRuneBaseCooldown ( uint8  index,
bool  skipGrace 
)
13317{
13318 uint8 rune = GetBaseRune(index);
13319 uint32 cooldown = RUNE_BASE_COOLDOWN;
13320 if (!skipGrace)
13321 cooldown -= GetGracePeriod(index) < 250 ? 0 : GetGracePeriod(index) - 250; // xinef: reduce by grace period, treat first 250ms as instant use of rune
13322
13324 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
13325 {
13326 if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune)
13327 cooldown = cooldown * (100 - (*i)->GetAmount()) / 100;
13328 }
13329
13330 return cooldown;
13331}
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
Definition: SpellAuraDefines.h:173
@ RUNE_BASE_COOLDOWN
Definition: Player.h:402
uint32 GetGracePeriod(uint8 index) const
Definition: Player.h:2485
RuneType GetBaseRune(uint8 index) const
Definition: Player.h:2482

References Unit::GetAuraEffectsByType(), GetBaseRune(), GetGracePeriod(), POWER_RUNE, RUNE_BASE_COOLDOWN, and SPELL_AURA_MOD_POWER_REGEN_PERCENT.

Referenced by Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetRuneCooldown()

uint32 Player::GetRuneCooldown ( uint8  index) const
inline

◆ GetRunesState()

uint8 Player::GetRunesState ( ) const
inline
2481{ return m_runes->runeState; }
uint8 runeState
Definition: Player.h:428

References m_runes, and Runes::runeState.

Referenced by Spell::EffectActivateRune(), and Spell::TakeRunePower().

◆ getRuneWeaponGUID()

ObjectGuid Player::getRuneWeaponGUID ( )
inline
2569{ return m_drwGUID; };
ObjectGuid m_drwGUID
Definition: Player.h:2570

References m_drwGUID.

◆ GetSaveTimer()

uint32 Player::GetSaveTimer ( ) const
inline
2331{ return m_nextSave; }

References m_nextSave.

Referenced by misc_commandscript::HandleSaveCommand().

◆ GetSelectedPlayer()

Player * Player::GetSelectedPlayer ( ) const
11500{
11501 if (ObjectGuid selectionGUID = GetGuidValue(UNIT_FIELD_TARGET))
11502 return ObjectAccessor::GetPlayer(*this, selectionGUID);
11503
11504 return nullptr;
11505}
@ UNIT_FIELD_TARGET
Definition: UpdateFields.h:92
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:223

References Object::GetGuidValue(), ObjectAccessor::GetPlayer(), and UNIT_FIELD_TARGET.

Referenced by Acore::ChatCommands::PlayerIdentifier::FromTarget().

◆ GetSelectedUnit()

◆ GetSemaphoreTeleportFar()

time_t Player::GetSemaphoreTeleportFar ( ) const
inline
2072{ return mSemaphoreTeleport_Far; }

References mSemaphoreTeleport_Far.

◆ GetSemaphoreTeleportNear()

time_t Player::GetSemaphoreTeleportNear ( ) const
inline
2071{ return mSemaphoreTeleport_Near; }

References mSemaphoreTeleport_Near.

◆ GetSession()

WorldSession * Player::GetSession ( ) const
inline
1974{ return m_session; }

References m_session.

Referenced by _addSpell(), _LoadHomeBind(), _LoadInventory(), Pet::_LoadSpellCooldowns(), Battleground::_ProcessProgress(), _SaveCharacter(), _SaveInstanceTimeRestrictions(), _StoreOrEquipNewItem(), ActivateSpec(), ActivateTaxiPathTo(), AddEnchantmentDuration(), AddItem(), Guild::AddMember(), InstanceMap::AddPlayerToMap(), AddRunePower(), addSpell(), Channel::Announce(), ApplyEquipCooldown(), TotemAI::AttackStart(), AutoUnequipOffhandIfNeed(), BanMgr::BanCharacter(), BindToInstance(), Group::BroadcastPacket(), Group::BroadcastReadyCheck(), SocialMgr::BroadcastToFriendListers(), AuctionHouseObject::BuildListAuctionItems(), BuildPlayerRepop(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), WorldSession::CanOpenMailBox(), CanSpeak(), BattlegroundSA::CaptureGraveyard(), CharacterActionIpLogger::CharacterIPLogAction(), CharmSpellInitialize(), Spell::CheckCast(), CheckDuelDistance(), Spell::CheckEffectTarget(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::CheckRequiredBosses(), AchievementMgr::CompletedAchievement(), ContinueTaxiFlight(), ConvertRune(), Create(), Guild::Create(), ArenaTeam::DelMember(), Object::DestroyForPlayer(), Group::Disband(), InstanceScript::DoSendNotifyToInstance(), DuelComplete(), DurabilityRepair(), Spell::EffectApplyGlyph(), Spell::EffectDiscoverTaxi(), Spell::EffectDuel(), Spell::EffectPlaySound(), Spell::EffectSummonPlayer(), Spell::EffectSummonRaFFriend(), EquipItem(), BattlegroundSA::EventPlayerDamagedGO(), AuctionListItemsDelayEvent::Execute(), BGQueueInviteEvent::Execute(), SendEncounterUnit::Execute(), lfg::LFGMgr::FinishDungeon(), Channel::FlagsNotify(), GetAurasForTarget(), ChannelMgr::GetChannel(), SocialMgr::GetFriendInfo(), getMaxTimer(), GetsRecruitAFriendBonus(), GiveLevel(), Group::GroupLoot(), WorldSession::HandleAcceptGrantLevel(), WorldSession::HandleAcceptTradeOpcode(), account_commandscript::HandleAccountSetAddonCommand(), account_commandscript::HandleAccountSetGmLevelCommand(), WorldSession::HandleAddFriendOpcode(), misc_commandscript::HandleAddItemCommand(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), AuraEffect::HandleAuraOpenStable(), AuraEffect::HandleAuraSetVehicle(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleBeginTradeOpcode(), character_commandscript::HandleCharacterLevel(), WorldSession::HandleChatIgnoredOpcode(), debug_commandscript::HandleDebugSendOpcodeCommand(), spell_gen_spirit_healer_res::HandleDummy(), cheat_commandscript::HandleExploreCheatCommand(), ticket_commandscript::HandleGMTicketUnAssignCommand(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupDeclineOpcode(), WorldSession::HandleGroupInviteOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), lookup_commandscript::HandleLookupPlayerIpCommand(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMessagechatOpcode(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyGenderCommand(), modify_commandscript::HandleModifyHPCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyMoneyCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), modify_commandscript::HandleModifySpellCommand(), WorldSession::HandleMovementOpcodes(), misc_commandscript::HandleMuteCommand(), WorldSession::HandleOfferPetitionOpcode(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleRaidReadyCheckOpcode(), reset_commandscript::HandleResetSpellsCommand(), reset_commandscript::HandleResetTalentsCommand(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_the_flag_of_ownership::HandleScript(), WorldSession::HandleSendMail(), send_commandscript::HandleSendMessageCommand(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), cheat_commandscript::HandleTaxiCheatCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnmuteCommand(), WorldSession::HandleWhoisOpcode(), WorldSession::HandleWhoOpcode(), ChatHandler::HasLowerSecurity(), hasSpanishClient(), lfg::LFGMgr::InitializeLockedDungeons(), InitTalentForLevel(), BattlegroundQueue::InviteGroupToBG(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), isBeingLoaded(), IsNeverVisible(), IsPetNeedBeTemporaryUnsummoned(), ObjectMgr::IsVendorItemValid(), IsVisibleGloballyFor(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), Channel::JoinNotify(), Unit::JumpTo(), Channel::KickOrBan(), Unit::KnockbackFrom(), Channel::LeaveNotify(), Channel::List(), LoadFromDB(), Pet::LoadPetFromDB(), GameObject::ModifyHealth(), ModifySpellCooldown(), Group::NeedBeforeGreed(), go_tele_to_dalaran_crystal::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), npc_augustus_the_touched::OnGossipSelect(), npc_rivern_frostwind::OnGossipSelect(), npc_roxi_ramrocket::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_wg_quest_giver::OnGossipSelect(), npc_drake_dealer_hurlunk::OnGossipSelect(), npc_shattrathflaskvendors::OnGossipSelect(), npc_slim::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_prof_leather::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), OnGossipSelect(), ServerMailReward::OnLogin(), lfg::LFGPlayerScript::OnLogout(), lfg::LFGPlayerScript::OnMapChanged(), BattlefieldWG::OnPlayerLeaveWar(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), Channel::Password(), Unit::PatchValuesUpdate(), InstanceMap::PermBindAllPlayers(), PetSpellInitialize(), Player(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), Battleground::PlayerAddedToBGCheckIfBGIsRunning(), InstanceSaveMgr::PlayerBindToInstance(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerUnbindInstance(), InstanceSaveMgr::PlayerUnbindInstanceNotExtended(), PossessSpellInitialize(), BattlegroundSA::PostUpdateImpl(), PrepareGossipMenu(), PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ProhibitSpellSchool(), Battleground::ReadyMarkerClicked(), RefundItem(), Group::RemoveMember(), RemovePet(), RemovePetitionsAndSigns(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), Group::ResetMaxEnchantingLevel(), ResurrectPlayer(), ResyncRunes(), RewardHonor(), Satisfy(), SatisfyQuestLog(), SaveToDB(), SendActionButtons(), npc_prof_alchemy::SendActionMenu(), npc_prof_blacksmith::SendActionMenu(), npc_prof_tailor::SendActionMenu(), AchievementMgr::SendAllAchievementData(), BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(), Battlefield::SendAreaSpiritHealerQueryOpcode(), SendAttackSwingBadFacingAttack(), SendAttackSwingCancelAttack(), SendAttackSwingCantAttack(), SendAttackSwingDeadTarget(), SendAttackSwingNotInRange(), AuctionHouseMgr::SendAuctionExpiredMail(), AuctionHouseMgr::SendAuctionOutbiddedMail(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), SendBuyError(), SendCanTakeQuestResponse(), Spell::SendCastResult(), SendCorpseReclaimDelay(), SendDuelCountdown(), SendDungeonDifficulty(), SendEnchantmentDurations(), SendEquipError(), SendEquipmentSetList(), SendExplorationExperience(), SocialMgr::SendFriendStatus(), ChatHandler::SendGMText(), SendInitialPacketsAfterAddToMap(), SendInitialPacketsBeforeAddToMap(), SendInitialSpells(), Map::SendInitTransports(), SendInitWorldStates(), BattlefieldWG::SendInitWorldStatesTo(), SendInstanceResetWarning(), BattlegroundQueue::SendJoinMessageArenaQueue(), SendLearnPacket(), SendLogXPGain(), Group::SendLootAllPassed(), Group::SendLootRoll(), Group::SendLootRollWon(), Group::SendLootStartRoll(), Group::SendLootStartRollToPlayer(), SendMailResult(), MailDraft::SendMailTo(), BattlegroundQueue::SendMessageBGQueue(), SendNewItem(), SendNewMail(), CreatureTextMgr::SendNonChatPacket(), SendNotifyLootItemRemoved(), SendNotifyLootMoneyRemoved(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SendPetActionFeedback(), Unit::SendPetAIReaction(), Spell::SendPetCastResult(), Unit::SendPetTalk(), WorldObject::SendPlayMusic(), SendPreparedQuest(), SendProficiency(), SendPushToPartyResponse(), SendQuestComplete(), SendQuestConfirmAccept(), SendQuestFailed(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestTimerFailed(), SendQuestUpdateAddCreatureOrGo(), SendQuestUpdateAddItem(), SendQuestUpdateAddPlayer(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendRaidDifficulty(), SendRaidInfo(), SendRefundInfo(), SendRemoveControlBar(), Map::SendRemoveTransports(), SendResetFailedNotify(), SendResetInstanceFailed(), SendResetInstanceSuccess(), AchievementMgr::SendRespondInspectAchievements(), Spell::SendResurrectRequest(), SendSavedInstances(), SendSellError(), PlayerSocial::SendSocialList(), SendSystemMessage(), SendTalentsInfoData(), SendTalentWipeConfirm(), SendTeleportAckPacket(), Item::SendTimeUpdate(), Acore::VisibleNotifier::SendToSelf(), SendTransferAborted(), BattlegroundSA::SendTransportInit(), BattlegroundSA::SendTransportsRemove(), Item::SendUpdateSockets(), Group::SendUpdateToPlayer(), Object::SendUpdateToPlayer(), ReputationMgr::SendVisible(), ChatHandler::SendWorldText(), ChatHandler::SendWorldTextOptional(), TradeData::SetAccepted(), SetBindPoint(), SetClientControl(), Item::SetEnchantment(), SetEquipmentSet(), SetGameMaster(), SetGMVisible(), Channel::SetMode(), TradeData::SetMoney(), SetMovement(), Channel::SetOwner(), SetRestBonus(), Unit::SetStandState(), Guild::Member::SetStats(), SetTitle(), Channel::ShouldAnnouncePlayer(), SortAuction(), SpawnCorpseBones(), SummonPet(), lfg::LFGMgr::TeleportPlayer(), TeleportTo(), Channel::ToggleModeration(), TradeCancel(), Channel::UnBan(), TradeData::Update(), Map::Update(), Pet::Update(), GameObject::Update(), Update(), PetAI::UpdateAI(), UpdateForQuestWorldObjects(), UpdateHomebindTime(), UpdateLocalChannels(), Group::UpdatePlayerOutOfRange(), UpdatePosition(), UpdateSpeakTime(), UpdateTriggerVisibility(), GameObject::Use(), VehicleSpellInitialize(), Whisper(), and Unit::Whisper().

◆ GetShield()

Item * Player::GetShield ( bool  useable = false) const
547{
548 Item* item = nullptr;
549 if (useable)
551 else
553 if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR)
554 return nullptr;
555
556 if (!useable)
557 return item;
558
559 if (item->IsBroken())
560 return nullptr;
561
562 return item;
563}
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1243

References ItemTemplate::Class, EQUIPMENT_SLOT_OFFHAND, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), and ITEM_CLASS_ARMOR.

Referenced by AuraEffect::CalculateAmount().

◆ GetShieldBlockValue()

uint32 Player::GetShieldBlockValue ( ) const
overridevirtual

Implements Unit.

5030{
5032
5033 value = (value < 0) ? 0 : value;
5034
5035 return uint32(value);
5036}

References FLAT_MOD, Unit::GetStat(), m_auraBaseMod, PCT_MOD, SHIELD_BLOCK_VALUE, and STAT_STRENGTH.

Referenced by UpdateShieldBlockValue().

◆ GetSightRange()

float Player::GetSightRange ( WorldObject const *  target = nullptr) const
overridevirtual

Reimplemented from WorldObject.

16235{
16236 float sightRange = WorldObject::GetSightRange(target);
16238 {
16239 sightRange += *_farSightDistance;
16240 }
16241
16242 return sightRange;
16243}
virtual float GetSightRange(WorldObject const *target=nullptr) const
Definition: Object.cpp:1672

References _farSightDistance, and WorldObject::GetSightRange().

Referenced by Group::UpdatePlayerOutOfRange(), and UpdateVisibilityForPlayer().

◆ GetSkillPermBonusValue()

int16 Player::GetSkillPermBonusValue ( uint32  skill) const
5471{
5472 if (!skill)
5473 return 0;
5474
5475 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5476 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5477 return 0;
5478
5480}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_PERM_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillStep()

uint16 Player::GetSkillStep ( uint16  skill) const
5382{
5383 if (!skill)
5384 return 0;
5385
5386 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5387 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5388 return 0;
5389
5390 return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
5391}
uint16 PAIR32_HIPART(uint32 x)
Definition: ObjectDefines.h:92

References Object::GetUInt32Value(), mSkillStatus, PAIR32_HIPART(), PLAYER_SKILL_INDEX, and SKILL_DELETED.

Referenced by learn_commandscript::HandleLearnAllRecipesCommand(), and misc_commandscript::HandleSetSkillCommand().

◆ GetSkillTempBonusValue()

int16 Player::GetSkillTempBonusValue ( uint32  skill) const
5483{
5484 if (!skill)
5485 return 0;
5486
5487 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5488 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5489 return 0;
5490
5492}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_TEMP_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillValue()

◆ GetSocial()

◆ GetSpec()

uint32 Player::GetSpec ( int8  spec = -1)
15961{
15962 uint32 mostTalentTabId = 0;
15963 uint32 mostTalentCount = 0;
15964 uint32 specIdx = 0;
15965
15966 if (m_specsCount) // not all instances of Player have a spec for some reason
15967 {
15968 if (spec < 0)
15969 specIdx = m_activeSpec;
15970 else
15971 specIdx = spec;
15972 // find class talent tabs (all players have 3 talent tabs)
15973 uint32 const* talentTabIds = GetTalentTabPages(getClass());
15974
15975 for (uint8 i = 0; i < MAX_TALENT_TABS; ++i)
15976 {
15977 uint32 talentCount = 0;
15978 uint32 talentTabId = talentTabIds[i];
15979 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
15980 {
15981 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
15982 if (!talentInfo)
15983 continue;
15984
15985 // skip another tab talents
15986 if (talentInfo->TalentTab != talentTabId)
15987 continue;
15988
15989 // find max talent rank (0~4)
15990 int8 curtalent_maxrank = -1;
15991 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
15992 {
15993 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], specIdx))
15994 {
15995 curtalent_maxrank = rank;
15996 break;
15997 }
15998 }
15999
16000 // not learned talent
16001 if (curtalent_maxrank < 0)
16002 continue;
16003
16004 talentCount += curtalent_maxrank + 1;
16005 }
16006
16007 if (mostTalentCount < talentCount)
16008 {
16009 mostTalentCount = talentCount;
16010 mostTalentTabId = talentTabId;
16011 }
16012 }
16013 }
16014 return mostTalentTabId;
16015}
uint32 const * GetTalentTabPages(uint8 cls)
Definition: DBCStores.cpp:824
#define MAX_TALENT_TABS
Definition: DBCStructure.h:1920

References Unit::getClass(), GetTalentTabPages(), HasTalent(), m_activeSpec, m_specsCount, MAX_TALENT_RANK, MAX_TALENT_TABS, TalentEntry::RankID, sTalentStore, and TalentEntry::TalentTab.

Referenced by HasCasterSpec(), HasHealSpec(), HasMeleeSpec(), and HasTankSpec().

◆ GetSpecsCount()

uint8 Player::GetSpecsCount ( ) const
inline

◆ GetSpellByProto()

uint32 Player::GetSpellByProto ( ItemTemplate proto)

◆ GetSpellCooldownDelay()

uint32 Player::GetSpellCooldownDelay ( uint32  spell_id) const
16295{
16296 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16297 return uint32(itr != m_spellCooldowns.end() && itr->second.end > getMSTime() ? itr->second.end - getMSTime() : 0);
16298}
uint32 getMSTime()
Definition: Timer.h:103

References getMSTime(), and m_spellCooldowns.

Referenced by Aura::HandleAuraSpecificMods(), npc_brewfest_keg_reciver::MoveInLineOfSight(), and ProhibitSpellSchool().

◆ GetSpellCooldownMap() [1/2]

SpellCooldowns & Player::GetSpellCooldownMap ( )
inline
1756{ return m_spellCooldowns; }

References m_spellCooldowns.

◆ GetSpellCooldownMap() [2/2]

◆ GetSpellCooldowns()

SpellCooldowns Player::GetSpellCooldowns ( ) const
inline
2144{ return m_spellCooldowns; }

References m_spellCooldowns.

Referenced by Unit::HandleDummyAuraProc().

◆ GetSpellCritFromIntellect()

float Player::GetSpellCritFromIntellect ( )
5109{
5110 uint8 level = GetLevel();
5111 uint32 pclass = getClass();
5112
5113 if (level > GT_MAX_LEVEL)
5114 level = GT_MAX_LEVEL;
5115
5116 GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1);
5117 GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5118 if (!critBase || !critRatio)
5119 return 0.0f;
5120
5121 float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
5122 return crit * 100.0f;
5123}
DBCStorage< GtChanceToSpellCritBaseEntry > sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt)
DBCStorage< GtChanceToSpellCritEntry > sGtChanceToSpellCritStore(GtChanceToSpellCritfmt)
Definition: DBCStructure.h:1062
float base
Definition: DBCStructure.h:1063
Definition: DBCStructure.h:1072
float ratio
Definition: DBCStructure.h:1073

References GtChanceToSpellCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToSpellCritEntry::ratio, sGtChanceToSpellCritBaseStore, sGtChanceToSpellCritStore, and STAT_INTELLECT.

Referenced by UpdateSpellCritChance().

◆ GetSpellMap() [1/2]

PlayerSpellMap & Player::GetSpellMap ( )
inline
1753{ return m_spells; }

References m_spells.

◆ GetSpellMap() [2/2]

◆ GetSpellModList()

SpellModList const & Player::GetSpellModList ( uint32  type) const
inline
2588{ return m_spellMods[type]; }

References m_spellMods.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetSpellPenetrationItemMod()

int32 Player::GetSpellPenetrationItemMod ( ) const
inline

◆ GetsRecruitAFriendBonus()

bool Player::GetsRecruitAFriendBonus ( bool  forXP)
12636{
12637 bool recruitAFriend = false;
12638 if (GetLevel() <= sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL) || !forXP)
12639 {
12640 if (Group* group = this->GetGroup())
12641 {
12642 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12643 {
12644 Player* player = itr->GetSource();
12645 if (!player || !player->IsInMap(this))
12646 continue;
12647
12648 if (!player->IsAtRecruitAFriendDistance(this))
12649 continue; // member (alive or dead) or his corpse at req. distance
12650
12651 if (forXP)
12652 {
12653 // level must be allowed to get RaF bonus
12654 if (player->GetLevel() > sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
12655 continue;
12656
12657 // level difference must be small enough to get RaF bonus, UNLESS we are lower level
12658 if (player->GetLevel() < GetLevel())
12660 continue;
12661 }
12662
12663 bool ARecruitedB = (player->GetSession()->GetRecruiterId() == GetSession()->GetAccountId());
12664 bool BRecruitedA = (GetSession()->GetRecruiterId() == player->GetSession()->GetAccountId());
12665 if (ARecruitedB || BRecruitedA)
12666 {
12667 recruitAFriend = true;
12668 break;
12669 }
12670 }
12671 }
12672 }
12673 return recruitAFriend;
12674}
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition: IWorld.h:251
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition: IWorld.h:252
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsAtRecruitAFriendDistance(WorldObject const *pOther) const
Definition: Player.cpp:12745
uint32 GetRecruiterId() const
Definition: WorldSession.h:526
uint32 GetAccountId() const
Definition: WorldSession.h:361

References CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, WorldSession::GetAccountId(), GetGroup(), Unit::GetLevel(), WorldSession::GetRecruiterId(), GetSession(), IsAtRecruitAFriendDistance(), WorldObject::IsInMap(), GroupReference::next(), and sWorld.

Referenced by CalculateReputationGain(), GiveXP(), and SetRestBonus().

◆ GetStartPosition()

WorldLocation Player::GetStartPosition ( ) const
11356{
11357 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
11358 uint32 mapId = info->mapId;
11360 return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
11361 return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
11362}

References CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, Unit::getClass(), Unit::getRace(), HasSpell(), IsClass(), PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, and sObjectMgr.

Referenced by misc_commandscript::HandleUnstuckCommand().

◆ GetStoredRaidDifficulty()

Difficulty Player::GetStoredRaidDifficulty ( ) const
inline
1899{ return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map

References m_raidMapDifficulty.

Referenced by SendInitialPacketsAfterAddToMap().

◆ GetSubGroup()

uint8 Player::GetSubGroup ( ) const
inline

◆ GetSummonExpireTimer()

time_t Player::GetSummonExpireTimer ( ) const
inline
1100{ return m_summon_expire; }

References m_summon_expire.

Referenced by Spell::CheckCast().

◆ GetTalentMap()

◆ GetTalentTreePoints()

void Player::GetTalentTreePoints ( uint8(&)  specPoints[3]) const
15232{
15233 const PlayerTalentMap& talentMap = GetTalentMap();
15234 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15235 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15236 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15237 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15238 if (tab->tabpage < 3)
15239 {
15240 // find current talent rank
15241 uint8 currentTalentRank = 0;
15242 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15243 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15244 {
15245 currentTalentRank = rank + 1;
15246 break;
15247 }
15248 specPoints[tab->tabpage] += currentTalentRank;
15249 }
15250}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

Referenced by lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTeamId()

TeamId Player::GetTeamId ( bool  original = false) const
inline
2084{ return original ? TeamIdForRace(getRace(true)) : m_team; };
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5786

References Unit::getRace(), m_team, and TeamIdForRace().

Referenced by ActivateTaxiPathTo(), GameObject::ActivateToQuest(), BattlegroundQueue::AddGroup(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), npc_love_in_air_snivel::AllowAction(), BattlegroundSA::AllowDefenseOfTheAncients(), LootItem::AllowedForPlayer(), Battlefield::AskToLeaveQueue(), SocialMgr::BroadcastToFriendListers(), Corpse::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_steam_powered_auctioneer::npc_steam_powered_auctioneerAI::CanBeSeen(), npc_mei_francis_mount::npc_mei_francis_mountAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), OPvPCapturePointZM_GraveYard::CanTalkTo(), CanUseItem(), BattlegroundSA::CaptureGraveyard(), ContinueTaxiFlight(), BattlegroundSA::DefendersPortalTeleport(), BattlegroundIC::DoAction(), DuelComplete(), Spell::EffectTeleportUnits(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundIC::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), BattlegroundAV::EventPlayerDefendsPoint(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundSA::EventPlayerUsedGO(), GetBgTeamId(), Battlefield::GetClosestGraveyard(), BattlegroundAB::GetClosestGraveyard(), BattlegroundAV::GetClosestGraveyard(), BattlegroundEY::GetClosestGraveyard(), BattlegroundIC::GetClosestGraveyard(), BattlegroundSA::GetClosestGraveyard(), BattlegroundWS::GetClosestGraveyard(), SocialMgr::GetFriendInfo(), Battleground::GetRealRepFactionForPlayer(), Guild::HandleAcceptMember(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), BattlegroundEY::HandleAreaTrigger(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleArenaTeamAcceptOpcode(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleCalendarEventInvite(), OutdoorPvPSI::HandleDropFlag(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), BattlefieldWG::HandleKill(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundAV::HandleKillPlayer(), BattlegroundIC::HandleKillPlayer(), BattlegroundAV::HandleKillUnit(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleOfferPetitionOpcode(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), Battlefield::HandlePlayerEnterZone(), OutdoorPvP::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), BattlegroundIC::HandlePlayerResurrect(), BattlegroundAV::HandleQuestComplete(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), WorldSession::HandleSendMail(), WorldSession::HandleWhoOpcode(), Battlefield::HasPlayer(), OutdoorPvP::HasPlayer(), lfg::LFGMgr::InitializeLockedDungeons(), Channel::Invite(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), SpellArea::IsFitToRequirements(), IsGroupVisibleFor(), BfCapturePoint::IsInsideObjective(), OPvPCapturePoint::IsInsideObjective(), lfg::LFGMgr::JoinRaidBrowser(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), Unit::Kill(), lfg::LFGMgr::LfrSearchAdd(), lfg::LFGMgr::LfrSearchRemove(), lfg::LFGMgr::LfrSetComment(), LoadFromDB(), AchievementCriteriaData::Meets(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_not_even_a_scratch::OnCheck(), BattlefieldWG::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_spirit_guide::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), lfg::LFGPlayerScript::OnLogin(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::OnPlayerEnter(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), BattlefieldWG::OnPlayerJoinWar(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), AreaTrigger_at_legion_teleporter::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::PassengerBoarded(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), RepopAtGraveyard(), ReportedAfkBy(), RewardHonor(), RewardReputation(), Satisfy(), AchievementMgr::SendAchievementEarned(), WorldSession::SendListInventory(), SendLoot(), Acore::MessageDistDeliverer::SendPacket(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), ObjectMgr::SendServerMail(), WorldSession::SendSpiritResurrect(), SendTaxiNodeStatusMultiple(), WorldSession::SendTaxiStatus(), Creature::SendZoneUnderAttackMessage(), spell_item_recall::SetDest(), SetEntryPoint(), SetFactionForRace(), Channel::SetMode(), Channel::SetOwner(), npc_midsummer_torch_target::SpellHit(), BattlegroundSA::TeleportToEntrancePosition(), OPvPCapturePoint::Update(), UpdateArea(), npc_midsummer_bonfire::UpdateBonfireBlessingBuffs(), UpdateLocalChannels(), UpdateZone(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ GetTeleportDest()

WorldLocation & Player::GetTeleportDest ( )
inline

◆ GetTemporaryUnsummonedPetNumber()

uint32 Player::GetTemporaryUnsummonedPetNumber ( ) const
inline

◆ GetTotalBaseModValue()

float Player::GetTotalBaseModValue ( BaseModGroup  modGroup) const
5016{
5017 if (modGroup >= BASEMOD_END)
5018 {
5019 LOG_ERROR("entities.player", "wrong BaseModGroup in GetTotalBaseModValue()!");
5020 return 0.0f;
5021 }
5022
5023 if (m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5024 return 0.0f;
5025
5026 return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
5027}

References BASEMOD_END, FLAT_MOD, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetTotalPercentageModValue()

float Player::GetTotalPercentageModValue ( BaseModGroup  modGroup) const
inline
2172{ return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }

References FLAT_MOD, m_auraBaseMod, and PCT_MOD.

Referenced by UpdateCritPercentage().

◆ GetTotalPlayedTime()

◆ GetTradeData()

◆ GetTrader()

Player * Player::GetTrader ( ) const
inline
1366{ return m_trade ? m_trade->GetTrader() : nullptr; }
Player * GetTrader() const
Definition: TradeData.h:41

References TradeData::GetTrader(), and m_trade.

Referenced by WorldSession::moveItems(), and UpdatePosition().

◆ GetTrainerSpellState()

TrainerSpellState Player::GetTrainerSpellState ( TrainerSpell const *  trainer_spell) const
3877{
3878 if (!trainer_spell)
3879 return TRAINER_SPELL_RED;
3880
3881 bool hasSpell = true;
3882 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3883 {
3884 if (!trainer_spell->learnedSpell[i])
3885 continue;
3886
3887 if (!HasSpell(trainer_spell->learnedSpell[i]))
3888 {
3889 hasSpell = false;
3890 break;
3891 }
3892 }
3893 // known spell
3894 if (hasSpell)
3895 return TRAINER_SPELL_GRAY;
3896
3897 // check skill requirement
3898 if (trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
3899 return TRAINER_SPELL_RED;
3900
3901 // check level requirement
3902 if (GetLevel() < trainer_spell->reqLevel)
3903 return TRAINER_SPELL_RED;
3904
3905 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3906 {
3907 if (!trainer_spell->learnedSpell[i])
3908 continue;
3909
3910 // check race/class requirement
3911 if (!IsSpellFitByClassAndRace(trainer_spell->learnedSpell[i]))
3912 return TRAINER_SPELL_RED;
3913
3914 if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->learnedSpell[i]))
3915 {
3916 // check prev.rank requirement
3917 if (prevSpell && !HasSpell(prevSpell))
3918 return TRAINER_SPELL_RED;
3919 }
3920
3921 SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(trainer_spell->learnedSpell[i]);
3922 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequired.first; itr != spellsRequired.second; ++itr)
3923 {
3924 // check additional spell requirement
3925 if (!HasSpell(itr->second))
3926 return TRAINER_SPELL_RED;
3927 }
3928 }
3929
3930 // check primary prof. limit
3931 // first rank of primary profession spell when there are no proffesions avalible is disabled
3932 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3933 {
3934 if (!trainer_spell->learnedSpell[i])
3935 continue;
3936 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainer_spell->learnedSpell[i]);
3937 if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank() && (GetFreePrimaryProfessionPoints() == 0))
3939 }
3940
3941 return TRAINER_SPELL_GREEN;
3942}
std::pair< SpellsRequiringSpellMap::const_iterator, SpellsRequiringSpellMap::const_iterator > SpellsRequiringSpellMapBounds
Definition: SpellMgr.h:570
@ TRAINER_SPELL_GREEN
Definition: Player.h:213
@ TRAINER_SPELL_GRAY
Definition: Player.h:215
@ TRAINER_SPELL_GREEN_DISABLED
Definition: Player.h:216
@ TRAINER_SPELL_RED
Definition: Player.h:214
bool IsSpellFitByClassAndRace(uint32 spell_id) const
Definition: Player.cpp:12309

References GetBaseSkillValue(), GetFreePrimaryProfessionPoints(), Unit::GetLevel(), HasSpell(), SpellInfo::IsPrimaryProfessionFirstRank(), IsSpellFitByClassAndRace(), TrainerSpell::learnedSpell, MAX_SPELL_EFFECTS, TrainerSpell::reqLevel, TrainerSpell::reqSkill, TrainerSpell::reqSkillValue, sSpellMgr, TRAINER_SPELL_GRAY, TRAINER_SPELL_GREEN, TRAINER_SPELL_GREEN_DISABLED, and TRAINER_SPELL_RED.

Referenced by WorldSession::HandleTrainerBuySpellOpcode(), and WorldSession::SendTrainerList().

◆ GetUseableItemByPos()

Item * Player::GetUseableItemByPos ( uint8  bag,
uint8  slot 
) const
inline

◆ GetViewpoint()

WorldObject * Player::GetViewpoint ( ) const
13160{
13162 return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER));
13163 return nullptr;
13164}
@ TYPEMASK_SEER
Definition: ObjectGuid.h:54
Object * GetObjectByTypeMask(WorldObject const &, ObjectGuid const guid, uint32 typemask)
Definition: ObjectAccessor.cpp:144
Definition: Object.h:403

References Object::GetGuidValue(), ObjectAccessor::GetObjectByTypeMask(), PLAYER_FARSIGHT, and TYPEMASK_SEER.

Referenced by CinematicMgr::EndCinematic(), WorldSession::HandleFarSightOpcode(), ArenaSpectator::HandleSpectatorWatchCommand(), RemoveFromWorld(), StopCastingBindSight(), and Map::Update().

◆ GetWeaponForAttack()

Item * Player::GetWeaponForAttack ( WeaponAttackType  attackType,
bool  useable = false 
) const

◆ GetWeaponProficiency()

uint32 Player::GetWeaponProficiency ( ) const
inline
1351{ return m_WeaponProficiency; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ GetXPRestBonus()

uint32 Player::GetXPRestBonus ( uint32  xp)
8815{
8816 uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
8817
8818 if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
8819 rested_bonus = xp;
8820
8821 SetRestBonus(GetRestBonus() - rested_bonus);
8822
8823 LOG_DEBUG("entities.player", "Player gain {} xp (+ {} Rested Bonus). Rested points={}", xp + rested_bonus, rested_bonus, GetRestBonus());
8824 return rested_bonus;
8825}
void SetRestBonus(float rest_bonus_new)
Definition: Player.cpp:10155
float GetRestBonus() const
Definition: Player.h:1193

References GetRestBonus(), LOG_DEBUG, and SetRestBonus().

Referenced by GiveXP().

◆ GetZoneIdFromDB()

uint32 Player::GetZoneIdFromDB ( ObjectGuid  guid)
static
6274{
6275 ObjectGuid::LowType guidLow = guid.GetCounter();
6276
6278 stmt->SetData(0, guidLow);
6279 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6280
6281 if (!result)
6282 return 0;
6283
6284 Field* fields = result->Fetch();
6285 uint32 zone = fields[0].Get<uint16>();
6286
6287 if (!zone)
6288 {
6289 // stored zone is zero, use generic and slow zone detection
6290 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ);
6291 stmt->SetData(0, guidLow);
6292 PreparedQueryResult posResult = CharacterDatabase.Query(stmt);
6293
6294 if (!posResult)
6295 {
6296 return 0;
6297 }
6298
6299 fields = posResult->Fetch();
6300 uint32 map = fields[0].Get<uint16>();
6301 float posx = fields[1].Get<float>();
6302 float posy = fields[2].Get<float>();
6303 float posz = fields[3].Get<float>();
6304
6305 if (!sMapStore.LookupEntry(map))
6306 return 0;
6307
6308 zone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, map, posx, posy, posz);
6309
6310 if (zone > 0)
6311 {
6312 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ZONE);
6313
6314 stmt->SetData(0, uint16(zone));
6315 stmt->SetData(1, guidLow);
6316
6317 CharacterDatabase.Execute(stmt);
6318 }
6319 }
6320
6321 return zone;
6322}
@ CHAR_SEL_CHAR_POSITION_XYZ
Definition: CharacterDatabase.h:53
@ CHAR_UPD_ZONE
Definition: CharacterDatabase.h:294
@ CHAR_SEL_CHAR_ZONE
Definition: CharacterDatabase.h:51

References CHAR_SEL_CHAR_POSITION_XYZ, CHAR_SEL_CHAR_ZONE, CHAR_UPD_ZONE, CharacterDatabase, Field::Get(), ObjectGuid::GetCounter(), PHASEMASK_NORMAL, PreparedStatementBase::SetData(), sMapMgr, and sMapStore.

Referenced by Guild::Member::LoadFromDB().

◆ GiveLevel()

void Player::GiveLevel ( uint8  level)
Todo:
find some better solution
2446{
2447 uint8 oldLevel = GetLevel();
2448 if (level == oldLevel)
2449 return;
2450
2451 if (Guild* guild = GetGuild())
2452 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
2453
2454 PlayerLevelInfo info;
2455 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info);
2456
2457 PlayerClassLevelInfo classInfo;
2458 sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
2459
2461 packet.Level = level;
2462 packet.HealthDelta = int32(classInfo.basehealth) - int32(GetCreateHealth());
2463
2465 // for (int i = 0; i < MAX_POWERS; ++i)
2466 packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana());
2467 packet.PowerDelta[1] = 0;
2468 packet.PowerDelta[2] = 0;
2469 packet.PowerDelta[3] = 0;
2470 packet.PowerDelta[4] = 0;
2471 packet.PowerDelta[5] = 0;
2472
2473 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2474 packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
2475
2476 SendDirectMessage(packet.Write());
2477
2478 SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level));
2479
2480 //update level, max level of skills
2481 m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
2482
2484
2485 SetLevel(level);
2486
2488
2489 // save base values (bonuses already included in stored stats
2490 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2491 SetCreateStat(Stats(i), info.stats[i]);
2492
2493 SetCreateHealth(classInfo.basehealth);
2494 SetCreateMana(classInfo.basemana);
2495
2499
2501
2502 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
2504
2506
2507 // set current level health and mana/energy to maximum after applying all mods.
2508 SetFullHealth();
2515
2516 // update level to hunter/summon pet
2517 if (Pet* pet = GetPet())
2518 pet->SynchronizeLevelWithOwner();
2519
2520 MailLevelReward const* mailReward = sObjectMgr->GetMailLevelReward(level, getRaceMask());
2521 if (mailReward && sScriptMgr->CanGiveMailRewardAtGiveLevel(this, level))
2522 {
2523 //- TODO: Poor design of mail system
2524 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2525 MailDraft(mailReward->mailTemplateId).SendMailTo(trans, this, MailSender(MAIL_CREATURE, mailReward->senderEntry));
2526 CharacterDatabase.CommitTransaction(trans);
2527 }
2528
2530
2531 // Refer-A-Friend
2532 if (GetSession()->GetRecruiterId())
2533 if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
2534 if (level % 2 == 0)
2535 {
2537
2538 if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
2540 }
2541
2543
2544 sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
2545}
@ GUILD_MEMBER_DATA_LEVEL
Definition: Guild.h:62
@ PLAYER_NEXT_LEVEL_XP
Definition: UpdateFields.h:340
@ CONFIG_ALWAYS_MAXSKILL
Definition: IWorld.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition: DBCEnums.h:124
@ POWER_RAGE
Definition: SharedDefines.h:270
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_FOCUS
Definition: SharedDefines.h:271
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
Definition: Player.h:289
uint32 basehealth
Definition: Player.h:291
uint32 basemana
Definition: Player.h:292
Definition: Player.h:303
std::array< uint32, MAX_STATS > stats
Definition: Player.h:309
void _ApplyAllLevelScaleItemMods(bool apply)
Definition: Player.cpp:7567
void UpdateSkillsToMaxSkillsForLevel()
Definition: PlayerUpdates.cpp:1085
Guild * GetGuild() const
Definition: Player.cpp:15954
void UpdateSkillsForLevel()
Definition: PlayerUpdates.cpp:1034
void SendQuestGiverStatusMultiple()
Definition: Player.cpp:7644
void SetCreateStat(Stats stat, float val)
Definition: Unit.h:1380
void SetCreateHealth(uint32 val)
Definition: Unit.h:1381
void SetCreateMana(uint32 val)
Definition: Unit.h:1383
void SetLevel(uint8 lvl, bool showLevelChange=true)
Definition: Unit.cpp:15387
uint32 GetCreateHealth() const
Definition: Unit.h:1382
uint32 GetCreateMana() const
Definition: Unit.h:1384
Definition: ObjectMgr.h:543
uint32 senderEntry
Definition: ObjectMgr.h:549
uint32 mailTemplateId
Definition: ObjectMgr.h:548
Definition: MiscPackets.h:45
uint32 Level
Definition: MiscPackets.h:51
std::array< uint32, MAX_STATS > StatDelta
Definition: MiscPackets.h:54
std::array< uint32, MAX_POWERS > PowerDelta
Definition: MiscPackets.h:53
uint32 HealthDelta
Definition: MiscPackets.h:52
WorldPacket const * Write() override
Definition: MiscPackets.cpp:34

References _ApplyAllLevelScaleItemMods(), ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CharacterDatabase, CONFIG_ALWAYS_MAXSKILL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreateHealth(), Unit::GetCreateMana(), Unit::GetCreateStat(), GetGuild(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Unit::getRaceMask(), GetSession(), GUILD_MEMBER_DATA_LEVEL, Object::HasByteFlag(), WorldPackets::Misc::LevelUpInfo::HealthDelta, InitGlyphsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), WorldPackets::Misc::LevelUpInfo::Level, m_grantableLevels, m_Played_time, MAIL_CREATURE, MailLevelReward::mailTemplateId, MAX_STATS, PLAYED_TIME_LEVEL, PLAYER_FIELD_BYTES, PLAYER_NEXT_LEVEL_XP, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, WorldPackets::Misc::LevelUpInfo::PowerDelta, SendDirectMessage(), MailLevelReward::senderEntry, MailDraft::SendMailTo(), SendQuestGiverStatusMultiple(), Object::SetByteFlag(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Unit::SetFullHealth(), Unit::SetLevel(), Unit::SetPower(), Unit::SetUInt32Value(), sObjectMgr, sScriptMgr, STAT_STRENGTH, WorldPackets::Misc::LevelUpInfo::StatDelta, PlayerLevelInfo::stats, sWorld, UpdateAchievementCriteria(), UpdateAllStats(), UpdateSkillsForLevel(), UpdateSkillsToMaxSkillsForLevel(), and WorldPackets::Misc::LevelUpInfo::Write().

Referenced by GiveXP(), WorldSession::HandleAcceptGrantLevel(), and character_commandscript::HandleCharacterLevel().

◆ GiveQuestSourceItem()

bool Player::GiveQuestSourceItem ( Quest const *  quest)
1330{
1331 uint32 srcitem = quest->GetSrcItemId();
1332 if (srcitem > 0)
1333 {
1334 uint32 count = quest->GetSrcItemCount();
1335 if (count <= 0)
1336 count = 1;
1337
1338 ItemPosCountVec dest;
1339 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
1340 if (msg == EQUIP_ERR_OK)
1341 {
1342 Item* item = StoreNewItem(dest, srcitem, true);
1343 SendNewItem(item, count, true, false);
1344 return true;
1345 }
1346 // player already have max amount required item, just report success
1347 else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)
1348 return true;
1349 else
1350 SendEquipError(msg, nullptr, nullptr, srcitem);
1351 return false;
1352 }
1353
1354 return true;
1355}

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by AddQuest().

◆ GiveXP()

void Player::GiveXP ( uint32  xp,
Unit victim,
float  group_rate = 1.0f,
bool  isLFGReward = false 
)
2371{
2372 if (xp < 1)
2373 {
2374 return;
2375 }
2376
2377 if (!IsAlive() && !GetBattlegroundId() && !isLFGReward)
2378 {
2379 return;
2380 }
2381
2383 {
2384 return;
2385 }
2386
2387 if (victim && victim->GetTypeId() == TYPEID_UNIT && !victim->ToCreature()->hasLootRecipient())
2388 {
2389 return;
2390 }
2391
2392 uint8 level = GetLevel();
2393
2394 // Favored experience increase START
2395 uint32 zone = GetZoneId();
2396 float favored_exp_mult = 0;
2397 if ((zone == 3483 || zone == 3562 || zone == 3836 || zone == 3713 || zone == 3714) && (HasAura(32096) || HasAura(32098)))
2398 favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
2399
2400 xp = uint32(xp * (1 + favored_exp_mult));
2401 // Favored experience increase END
2402
2403 // XP to money conversion processed in Player::RewardQuest
2404 if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2405 return;
2406
2407 uint32 bonus_xp = 0;
2408 bool recruitAFriend = GetsRecruitAFriendBonus(true);
2409
2410 // RaF does NOT stack with rested experience
2411 if (recruitAFriend)
2412 bonus_xp = 2 * xp; // xp + bonus_xp must add up to 3 * xp for RaF; calculation for quests done client-side
2413 else
2414 bonus_xp = victim ? GetXPRestBonus(xp) : 0; // XP resting bonus
2415
2416 // hooks and multipliers can modify the xp with a zero or negative value
2417 // check again before sending invalid xp to the client
2418 if (xp < 1)
2419 {
2420 return;
2421 }
2422
2423 SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate);
2424
2427 uint32 newXP = curXP + xp + bonus_xp;
2428
2429 while (newXP >= nextLvlXP && level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2430 {
2431 newXP -= nextLvlXP;
2432
2433 if (level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2434 GiveLevel(level + 1);
2435
2436 level = GetLevel();
2438 }
2439
2440 SetUInt32Value(PLAYER_XP, newXP);
2441}
@ PLAYER_FLAGS_NO_XP_GAIN
Definition: Player.h:499
bool hasLootRecipient() const
Definition: Creature.h:232
void GiveLevel(uint8 level)
Definition: Player.cpp:2445
uint32 GetXPRestBonus(uint32 xp)
Definition: Player.cpp:8814
void SendLogXPGain(uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
Definition: Player.cpp:2351

References CONFIG_MAX_PLAYER_LEVEL, GetBattlegroundId(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Object::GetTypeId(), Object::GetUInt32Value(), GetXPRestBonus(), WorldObject::GetZoneId(), GiveLevel(), Unit::HasAura(), Creature::hasLootRecipient(), HasPlayerFlag(), Unit::IsAlive(), PLAYER_FLAGS_NO_XP_GAIN, PLAYER_NEXT_LEVEL_XP, PLAYER_XP, SendLogXPGain(), Unit::SetUInt32Value(), sWorld, Object::ToCreature(), and TYPEID_UNIT.

Referenced by KillRewarder::_RewardXP(), CheckAreaExploreAndOutdoor(), RewardHonor(), and RewardQuest().

◆ GroupEventHappens()

void Player::GroupEventHappens ( uint32  questId,
WorldObject const *  pEventObject 
)
1813{
1814 if (Group* group = GetGroup())
1815 {
1816 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
1817 {
1818 Player* player = itr->GetSource();
1819
1820 // for any leave or dead (with not released body) group member at appropriate distance
1821 if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
1822 player->AreaExploredOrEventHappens(questId);
1823 }
1824 }
1825 else
1827}
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition: Player.cpp:12709
void AreaExploredOrEventHappens(uint32 questId)
Definition: PlayerQuest.cpp:1785

References AreaExploredOrEventHappens(), GetCorpse(), GetGroup(), IsAtGroupRewardDistance(), and GroupReference::next().

Referenced by SmartAI::EndPath(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), Map::ScriptsProcess(), SmartAI::StopFollow(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_rinji::npc_rinjiAI::WaypointReached(), npc_corporal_keeshan::npc_corporal_keeshanAI::WaypointReached(), npc_deathstalker_erland::npc_deathstalker_erlandAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached(), npc_gilthares::npc_giltharesAI::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_bonker_togglevolt::npc_bonker_togglevoltAI::WaypointReached(), npc_emily::npc_emilyAI::WaypointReached(), npc_apothecary_hanes::npc_Apothecary_HanesAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::WaypointReached(), npc_bessy::npc_bessyAI::WaypointReached(), npc_kservant::npc_kservantAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleBaseModValue()

void Player::HandleBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  amount,
bool  apply 
)
4962{
4963 if (modGroup >= BASEMOD_END)
4964 {
4965 LOG_ERROR("entities.player", "ERROR in HandleBaseModValue(): non existed BaseModGroup!");
4966 return;
4967 }
4968
4969 switch (modType)
4970 {
4971 case FLAT_MOD:
4972 m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
4973 break;
4974 case PCT_MOD:
4975 ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
4976 break;
4977 }
4978
4979 if (!CanModifyStats())
4980 return;
4981
4982 switch (modGroup)
4983 {
4984 case CRIT_PERCENTAGE:
4986 break;
4989 break;
4992 break;
4993 case SHIELD_BLOCK_VALUE:
4995 break;
4996 default:
4997 break;
4998 }
4999}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
void UpdateShieldBlockValue()
Definition: StatSystem.cpp:522
void UpdateCritPercentage(WeaponAttackType attType)
Definition: StatSystem.cpp:641

References ApplyPercentModFloatVar(), BASE_ATTACK, BASEMOD_END, Unit::CanModifyStats(), CRIT_PERCENTAGE, FLAT_MOD, LOG_ERROR, m_auraBaseMod, OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PCT_MOD, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, SHIELD_BLOCK_VALUE, UpdateCritPercentage(), and UpdateShieldBlockValue().

Referenced by _ApplyItemBonuses(), _ApplyWeaponDependentAuraCritMod(), ApplyEnchantment(), AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleAuraModWeaponCritPercent(), and AuraEffect::HandleShieldBlockValue().

◆ HandleDrowning()

void Player::HandleDrowning ( uint32  time_diff)
protected
Todo:
: Check this formula
Todo:
: Check this formula
834{
836 return;
837
838 // In water
840 {
841 // Breath timer not activated - activate it
843 {
846 }
847 else // If activated - do tick
848 {
849 m_MirrorTimer[BREATH_TIMER] -= time_diff;
850 // Timer limit - need deal damage
852 {
854 // Calculate and deal damage
856 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
858 }
859 else if (!(m_MirrorTimerFlagsLast & UNDERWATER_INWATER)) // Update time in client if need
861 }
862 }
863 else if (m_MirrorTimer[BREATH_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
864 {
865 int32 UnderWaterTime = getMaxTimer(BREATH_TIMER);
866 // Need breath regen
867 m_MirrorTimer[BREATH_TIMER] += 10 * time_diff;
868 if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive())
872 }
873
874 // In dark water
876 {
877 // Fatigue timer not activated - activate it
879 {
882 }
883 else
884 {
885 m_MirrorTimer[FATIGUE_TIMER] -= time_diff;
886 // Timer limit - need deal damage or teleport ghost to graveyard
888 {
890 if (IsAlive()) // Calculate and deal damage
891 {
892 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
894 }
895 else if (HasPlayerFlag(PLAYER_FLAGS_GHOST)) // Teleport ghost to graveyard
897 }
900 }
901 }
902 else if (m_MirrorTimer[FATIGUE_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
903 {
904 int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER);
905 m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff;
906 if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive())
910 }
911
912 if (m_MirrorTimerFlags & (UNDERWATER_INLAVA /*| UNDERWATER_INSLIME*/) && !(_lastLiquid && _lastLiquid->SpellId))
913 {
914 // Breath timer not activated - activate it
917 else
918 {
919 m_MirrorTimer[FIRE_TIMER] -= time_diff;
920 if (m_MirrorTimer[FIRE_TIMER] < 0)
921 {
922 m_MirrorTimer[FIRE_TIMER] += 2020;
923 // Calculate and deal damage
925 uint32 damage = urand(600, 700);
928 // need to skip Slime damage in Undercity,
929 // maybe someone can find better way to handle environmental damage
930 //else if (m_zoneUpdateId != 1497)
931 // EnvironmentalDamage(DAMAGE_SLIME, damage);
932 }
933 }
934 }
935 else
937
938 // Recheck timers flag
939 m_MirrorTimerFlags &= ~UNDERWATER_EXIST_TIMERS;
940 for (uint8 i = 0; i < MAX_TIMERS; ++i)
942 {
944 break;
945 }
947}
@ DAMAGE_DROWNING
Definition: Player.h:835
@ DAMAGE_EXHAUSTED
Definition: Player.h:834
@ UNDERWATER_INDARKWATER
Definition: Player.h:104
@ UNDERWATER_EXIST_TIMERS
Definition: Player.h:106
@ UNDERWATER_INWATER
Definition: Player.h:101
@ UNDERWATER_INLAVA
Definition: Player.h:102
void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
Definition: Player.cpp:730
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
Definition: Player.cpp:753
void RepopAtGraveyard()
Definition: Player.cpp:4862
int32 getMaxTimer(MirrorTimerType timer)
Definition: Player.cpp:806
void StopMirrorTimer(MirrorTimerType Type)
Definition: Player.cpp:741
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:1881
uint32 SpellId
Definition: DBCStructure.h:1289

References Unit::_lastLiquid, BREATH_TIMER, DAMAGE_DROWNING, DAMAGE_EXHAUSTED, DAMAGE_LAVA, DISABLED_MIRROR_TIMER, EnvironmentalDamage(), FATIGUE_TIMER, FIRE_TIMER, Unit::GetLevel(), Unit::GetMaxHealth(), getMaxTimer(), HasPlayerFlag(), IN_MILLISECONDS, Unit::IsAlive(), m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, MAX_TIMERS, PLAYER_FLAGS_GHOST, RepopAtGraveyard(), SendMirrorTimer(), LiquidTypeEntry::SpellId, StopMirrorTimer(), UNDERWATER_EXIST_TIMERS, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INWATER, and urand().

Referenced by Update().

◆ HandleFall()

void Player::HandleFall ( MovementInfo const &  movementInfo)
13796{
13797 // calculate total z distance of the fall
13798 float z_diff = m_lastFallZ - movementInfo.pos.GetPositionZ();
13799
13800 //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored
13801 // 14.57 can be calculated by resolving damageperc formula below to 0
13802 if (z_diff >= 14.57f && !isDead() && !IsGameMaster() && !GetCommandStatus(CHEAT_GOD) &&
13805 {
13806 //Safe fall, fall height reduction
13808
13809 float damageperc = 0.018f * (z_diff - safe_fall) - 0.2426f;
13810 uint32 original_health = GetHealth(), final_damage = 0;
13811
13813 {
13814 uint32 damage = (uint32)(damageperc * GetMaxHealth() * sWorld->getRate(RATE_DAMAGE_FALL));
13815
13816 //float height = movementInfo.pos.m_positionZ;
13817 //UpdateGroundPositionZ(movementInfo.pos.m_positionX, movementInfo.pos.m_positionY, height);
13818
13819 if (damage > 0)
13820 {
13821 //Prevent fall damage from being more than the player maximum health
13822 if (damage > GetMaxHealth())
13823 damage = GetMaxHealth();
13824
13825 // Gust of Wind
13826 if (HasAura(43621))
13827 damage = GetMaxHealth() / 2;
13828
13829 // Divine Protection
13830 if (HasAura(498))
13831 {
13832 damage /= 2;
13833 }
13834
13835 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage);
13836 }
13837
13838 //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
13839 LOG_DEBUG("entities.player", "FALLDAMAGE mZ={} z={} fallTime={} damage={} SF={}", movementInfo.pos.GetPositionZ(), GetPositionZ(), movementInfo.fallTime, damage, safe_fall);
13840 }
13841
13842 // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
13843 if (IsAlive() && final_damage < original_health)
13845 }
13846}
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_SAFE_FALL
Definition: SpellAuraDefines.h:207
@ CHEAT_GOD
Definition: Player.h:998
@ RATE_DAMAGE_FALL
Definition: IWorld.h:505
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition: DBCEnums.h:139
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1177
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12836
bool isDead() const
Definition: Unit.h:1153

References ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, CHEAT_GOD, DAMAGE_FALL, EnvironmentalDamage(), MovementInfo::fallTime, GetCommandStatus(), Unit::GetHealth(), Unit::GetMaxHealth(), Position::GetPositionZ(), Unit::GetTotalAuraModifier(), Unit::HasAura(), Unit::HasAuraType(), Unit::IsAlive(), Unit::isDead(), IsGameMaster(), Unit::IsImmunedToDamageOrSchool(), LOG_DEBUG, m_lastFallZ, MovementInfo::pos, RATE_DAMAGE_FALL, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_SAFE_FALL, SPELL_SCHOOL_MASK_NORMAL, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMovementOpcodes().

◆ HandleSobering()

void Player::HandleSobering ( )
protected

The player sobers by 1% every 9 seconds.

951{
952 m_drunkTimer = 0;
953
954 uint8 currentDrunkValue = GetDrunkValue();
955 uint8 drunk = currentDrunkValue ? --currentDrunkValue : 0;
956 SetDrunkValue(drunk);
957}
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId=0)
Definition: Player.cpp:970

References GetDrunkValue(), m_drunkTimer, and SetDrunkValue().

Referenced by Update().

◆ Has310Flyer()

bool Player::Has310Flyer ( bool  checkAllSpells,
uint32  excludeSpellId = 0 
)
3465{
3466 if (!checkAllSpells)
3468 else
3469 {
3470 SetHas310Flyer(false);
3471 SpellInfo const* spellInfo;
3472 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
3473 {
3474 // pussywizard:
3475 if (itr->second->State == PLAYERSPELL_REMOVED)
3476 continue;
3477
3478 if (itr->first == excludeSpellId)
3479 continue;
3480
3481 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first);
3482 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3483 {
3484 if (_spell_idx->second->SkillLine != SKILL_MOUNTS)
3485 break; // We can break because mount spells belong only to one skillline (at least 310 flyers do)
3486
3487 spellInfo = sSpellMgr->AssertSpellInfo(itr->first);
3488 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3489 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3490 spellInfo->Effects[i].CalcValue() == 310)
3491 {
3492 SetHas310Flyer(true);
3493 return true;
3494 }
3495 }
3496 }
3497 }
3498
3499 return false;
3500}
@ PLAYER_EXTRA_HAS_310_FLYER
Definition: Player.h:590

References SpellInfo::Effects, m_ExtraFlags, m_spells, MAX_SPELL_EFFECTS, PLAYER_EXTRA_HAS_310_FLYER, PLAYERSPELL_REMOVED, SetHas310Flyer(), SKILL_MOUNTS, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and sSpellMgr.

Referenced by _addSpell(), and removeSpell().

◆ HasAchieved()

bool Player::HasAchieved ( uint32  achievementId) const
13864{
13865 return m_achievementMgr->HasAchieved(achievementId);
13866}
bool HasAchieved(uint32 achievementId) const
Definition: AchievementMgr.cpp:2391

References AchievementMgr::HasAchieved(), and m_achievementMgr.

Referenced by _LoadBrewOfTheMonth(), spell_gen_on_tournament_mount::GetPennatSpellId(), BattlegroundIC::HandleAreaTrigger(), lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ HasActivePowerType()

bool Player::HasActivePowerType ( Powers  power)
overridevirtual

Reimplemented from Unit.

2736{
2737 if (sScriptMgr->OnPlayerHasActivePowerType(this, power))
2738 return true;
2739 else
2740 return (getPowerType() == power);
2741}

References Unit::getPowerType(), and sScriptMgr.

Referenced by Create(), and ResetAllPowers().

◆ HasActiveSpell()

bool Player::HasActiveSpell ( uint32  spell) const
3871{
3872 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3873 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active && itr->second->IsInSpec(m_activeSpec));
3874}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by _AddSpellCooldown(), ActivateSpec(), spell_dk_dancing_rune_weapon::CheckProc(), WorldSession::HandleCastSpellOpcode(), and learnSpell().

◆ HasAtLoginFlag()

◆ HasCasterSpec()

bool Player::HasCasterSpec ( )
16059{
16060 switch (GetSpec(GetActiveSpec()))
16061 {
16074 return true;
16075 default:
16076 break;
16077 }
16078 return false;
16079}
@ TALENT_TREE_HUNTER_SURVIVAL
Definition: Player.h:153
@ TALENT_TREE_MAGE_FIRE
Definition: Player.h:167
@ TALENT_TREE_PRIEST_SHADOW
Definition: Player.h:159
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition: Player.h:163
@ TALENT_TREE_HUNTER_BEAST_MASTERY
Definition: Player.h:151
@ TALENT_TREE_WARLOCK_DEMONOLOGY
Definition: Player.h:170
@ TALENT_TREE_WARLOCK_DESTRUCTION
Definition: Player.h:171
@ TALENT_TREE_WARLOCK_AFFLICTION
Definition: Player.h:169
@ TALENT_TREE_MAGE_ARCANE
Definition: Player.h:166
@ TALENT_TREE_MAGE_FROST
Definition: Player.h:168
@ TALENT_TREE_DRUID_BALANCE
Definition: Player.h:172
@ TALENT_TREE_HUNTER_MARKSMANSHIP
Definition: Player.h:152
uint32 GetSpec(int8 spec=-1)
Definition: Player.cpp:15960

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_BALANCE, TALENT_TREE_HUNTER_BEAST_MASTERY, TALENT_TREE_HUNTER_MARKSMANSHIP, TALENT_TREE_HUNTER_SURVIVAL, TALENT_TREE_MAGE_ARCANE, TALENT_TREE_MAGE_FIRE, TALENT_TREE_MAGE_FROST, TALENT_TREE_PRIEST_SHADOW, TALENT_TREE_SHAMAN_ELEMENTAL, TALENT_TREE_WARLOCK_AFFLICTION, TALENT_TREE_WARLOCK_DEMONOLOGY, and TALENT_TREE_WARLOCK_DESTRUCTION.

◆ HasCorpse()

◆ HasDelayedTeleport()

bool Player::HasDelayedTeleport ( ) const
inlineprivate
2909{ return m_bHasDelayedTeleport; }

References m_bHasDelayedTeleport.

Referenced by Update().

◆ HasEnoughMoney() [1/2]

bool Player::HasEnoughMoney ( int32  amount) const
inline
1596 {
1597 if (amount > 0)
1598 return (GetMoney() >= (uint32) amount);
1599 return true;
1600 }

References GetMoney().

◆ HasEnoughMoney() [2/2]

◆ HasFreeBattlegroundQueueId()

bool Player::HasFreeBattlegroundQueueId ( ) const

◆ HasHealSpec()

bool Player::HasHealSpec ( )
16082{
16083 switch (GetSpec(GetActiveSpec()))
16084 {
16090 return true;
16091 default:
16092 break;
16093 }
16094 return false;
16095}
@ TALENT_TREE_DRUID_RESTORATION
Definition: Player.h:174
@ TALENT_TREE_SHAMAN_RESTORATION
Definition: Player.h:165
@ TALENT_TREE_PRIEST_HOLY
Definition: Player.h:158
@ TALENT_TREE_PALADIN_HOLY
Definition: Player.h:148
@ TALENT_TREE_PRIEST_DISCIPLINE
Definition: Player.h:157

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_RESTORATION, TALENT_TREE_PALADIN_HOLY, TALENT_TREE_PRIEST_DISCIPLINE, TALENT_TREE_PRIEST_HOLY, and TALENT_TREE_SHAMAN_RESTORATION.

◆ HasItemCount()

bool Player::HasItemCount ( uint32  item,
uint32  count = 1,
bool  inBankAlso = false 
) const
679{
680 uint32 tempcount = 0;
682 {
684 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
685 {
686 tempcount += pItem->GetCount();
687 if (tempcount >= count)
688 return true;
689 }
690 }
692 {
694 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
695 {
696 tempcount += pItem->GetCount();
697 if (tempcount >= count)
698 return true;
699 }
700 }
702 {
703 if (Bag* pBag = GetBagByPos(i))
704 {
705 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
706 {
707 Item* pItem = GetItemByPos(i, j);
708 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
709 {
710 tempcount += pItem->GetCount();
711 if (tempcount >= count)
712 return true;
713 }
714 }
715 }
716 }
717
718 if (inBankAlso)
719 {
721 {
723 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
724 {
725 tempcount += pItem->GetCount();
726 if (tempcount >= count)
727 return true;
728 }
729 }
731 {
732 if (Bag* pBag = GetBagByPos(i))
733 {
734 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
735 {
736 Item* pItem = GetItemByPos(i, j);
737 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
738 {
739 tempcount += pItem->GetCount();
740 if (tempcount >= count)
741 return true;
742 }
743 }
744 }
745 }
746 }
747
748 return false;
749}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, Item::IsInTrade(), and KEYRING_SLOT_START.

Referenced by LootItem::AllowedForPlayer(), BuyItemFromVendorSlot(), CanCompleteRepeatableQuest(), Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), Spell::EffectCreateItem2(), GetResurrectionSpellId(), go_soulwell::go_soulwellAI::GossipHello(), go_celestial_planetarium_access::go_celestial_planetarium_accessAI::GossipHello(), misc_commandscript::HandleAddItemCommand(), lfg::LFGMgr::InitializeLockedDungeons(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_oculus_drakegiver::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), AreaTrigger_at_voltarus_middle::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_twilight_grove::OnTrigger(), NPCStaveQuestAI::QuestIncomplete(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Satisfy(), npc_aquementas::npc_aquementasAI::SendItem(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and Spell::WriteCastResultInfo().

◆ HasItemFitToSpellRequirements()

bool Player::HasItemFitToSpellRequirements ( SpellInfo const *  spellInfo,
Item const *  ignoreItem = nullptr 
) const
12463{
12464 if (spellInfo->EquippedItemClass < 0)
12465 return true;
12466
12467 // scan other equipped items for same requirements (mostly 2 daggers/etc)
12468 // for optimize check 2 used cases only
12469 switch (spellInfo->EquippedItemClass)
12470 {
12471 case ITEM_CLASS_WEAPON:
12472 {
12475 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12476 return true;
12477 break;
12478 }
12479 case ITEM_CLASS_ARMOR:
12480 {
12481 // tabard not have dependent spells
12484 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12485 return true;
12486
12487 // shields can be equipped to offhand slot
12489 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12490 return true;
12491
12492 // ranged slot can have some armor subclasses
12494 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12495 return true;
12496
12497 break;
12498 }
12499 default:
12500 LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class {}", spellInfo->EquippedItemClass);
12501 break;
12502 }
12503
12504 return false;
12505}

References EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, SpellInfo::EquippedItemClass, GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsFitToSpellRequirements(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, and LOG_ERROR.

Referenced by Unit::CalcArmorReducedDamage(), Spell::CheckItems(), and RemoveItemDependentAurasAndCasts().

◆ HasItemOrGemWithIdEquipped()

bool Player::HasItemOrGemWithIdEquipped ( uint32  item,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
752{
753 uint32 tempcount = 0;
755 {
756 if (i == except_slot)
757 continue;
758
760 if (pItem && pItem->GetEntry() == item)
761 {
762 tempcount += pItem->GetCount();
763 if (tempcount >= count)
764 return true;
765 }
766 }
767
768 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
769 if (pProto && pProto->GemProperties)
770 {
772 {
773 if (i == except_slot)
774 continue;
775
777 if (pItem && pItem->GetTemplate()->Socket[0].Color)
778 {
779 tempcount += pItem->GetGemCountWithID(item);
780 if (tempcount >= count)
781 return true;
782 }
783 }
784 }
785
786 return false;
787}
uint8 GetGemCountWithID(uint32 GemID) const
Definition: Item.cpp:1015

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, Item::GetCount(), Object::GetEntry(), Item::GetGemCountWithID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, sObjectMgr, and ItemTemplate::Socket.

Referenced by npc_eris_hevenfire::npc_eris_hevenfireAI::CanBeSeen(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::CanBeSeen(), CanEquipUniqueItem(), achievement_pb_pilgrims_peril::OnCheck(), and achievement_pb_terokkar_turkey_time::OnCheck().

◆ HasItemOrGemWithLimitCategoryEquipped()

bool Player::HasItemOrGemWithLimitCategoryEquipped ( uint32  limitCategory,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
790{
791 uint32 tempcount = 0;
793 {
794 if (i == except_slot)
795 continue;
796
798 if (!pItem)
799 continue;
800
801 ItemTemplate const* pProto = pItem->GetTemplate();
802 if (!pProto)
803 continue;
804
805 if (pProto->ItemLimitCategory == limitCategory)
806 {
807 tempcount += pItem->GetCount();
808 if (tempcount >= count)
809 return true;
810 }
811
813 {
814 tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
815 if (tempcount >= count)
816 return true;
817 }
818 }
819
820 return false;
821}

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetCount(), Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::ItemLimitCategory, PRISMATIC_ENCHANTMENT_SLOT, and ItemTemplate::Socket.

Referenced by CanEquipUniqueItem().

◆ HasItemTotemCategory()

bool Player::HasItemTotemCategory ( uint32  TotemCategory) const
875{
876 Item* pItem;
878 {
881 return true;
882 }
884 {
887 return true;
888 }
890 {
891 if (Bag* pBag = GetBagByPos(i))
892 {
893 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
894 {
895 pItem = GetItemByPos(i, j);
897 return true;
898 }
899 }
900 }
901 return false;
902}
TotemCategory
Definition: SharedDefines.h:3083
bool IsTotemCategoryCompatiableWith(ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
Definition: PlayerStorage.cpp:904

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, IsTotemCategoryCompatiableWith(), and KEYRING_SLOT_START.

Referenced by Spell::CheckItems().

◆ HasMeleeSpec()

bool Player::HasMeleeSpec ( )
16036{
16037 switch (GetSpec(GetActiveSpec()))
16038 {
16048 return true;
16050 if (GetShapeshiftForm() == FORM_CAT)
16051 return true;
16052 default:
16053 break;
16054 }
16055 return false;
16056}
@ TALENT_TREE_DEATH_KNIGHT_FROST
Definition: Player.h:161
@ TALENT_TREE_DRUID_FERAL_COMBAT
Definition: Player.h:173
@ TALENT_TREE_WARRIOR_FURY
Definition: Player.h:146
@ TALENT_TREE_ROGUE_ASSASSINATION
Definition: Player.h:154
@ TALENT_TREE_DEATH_KNIGHT_UNHOLY
Definition: Player.h:162
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition: Player.h:164
@ TALENT_TREE_WARRIOR_ARMS
Definition: Player.h:145
@ TALENT_TREE_ROGUE_COMBAT
Definition: Player.h:155
@ TALENT_TREE_PALADIN_RETRIBUTION
Definition: Player.h:150
@ TALENT_TREE_ROGUE_SUBTLETY
Definition: Player.h:156
@ FORM_CAT
Definition: UnitDefines.h:70

References FORM_CAT, GetActiveSpec(), Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_FROST, TALENT_TREE_DEATH_KNIGHT_UNHOLY, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_RETRIBUTION, TALENT_TREE_ROGUE_ASSASSINATION, TALENT_TREE_ROGUE_COMBAT, TALENT_TREE_ROGUE_SUBTLETY, TALENT_TREE_SHAMAN_ENHANCEMENT, TALENT_TREE_WARRIOR_ARMS, and TALENT_TREE_WARRIOR_FURY.

◆ HasPendingBind()

◆ HasPendingSpectatorForBG()

bool Player::HasPendingSpectatorForBG ( uint32  bgInstanceId) const
inline
2556{ return m_pendingSpectatorForBG == bgInstanceId; }

References m_pendingSpectatorForBG.

Referenced by WorldSession::HandleMoveWorldportAck(), and TeleportTo().

◆ HasPlayerFlag()

◆ HasPvPForcingQuest()

bool Player::HasPvPForcingQuest ( ) const
2490{
2491 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2492 {
2493 uint32 questId = GetQuestSlotQuestId(i);
2494 if (questId == 0)
2495 continue;
2496
2497 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
2498 if (!quest)
2499 continue;
2500
2501 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
2502 return true;
2503 }
2504
2505 return false;
2506}

References GetQuestSlotQuestId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_FLAGS_PVP, and sObjectMgr.

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), and UpdateZone().

◆ HasQuest()

bool Player::HasQuest ( uint32  questId) const
102{
103 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
104 {
105 uint32 questid = GetQuestSlotQuestId(i);
106 if (questid == questId)
107 {
108 return true;
109 }
110 }
111
112 return false;
113}

References GetQuestSlotQuestId(), and MAX_QUEST_LOG_SIZE.

◆ HasQuestForGO()

bool Player::HasQuestForGO ( int32  GOId) const
12335{
12336 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
12337 {
12338 uint32 questid = GetQuestSlotQuestId(i);
12339 if (questid == 0)
12340 continue;
12341
12342 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
12343 if (qs_itr == m_QuestStatus.end())
12344 continue;
12345
12346 QuestStatusData const& qs = qs_itr->second;
12347
12349 {
12350 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
12351 if (!qinfo)
12352 continue;
12353
12354 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
12355 continue;
12356
12357 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
12358 {
12359 if (qinfo->RequiredNpcOrGo[j] >= 0) //skip non GO case
12360 continue;
12361
12362 if ((-1)*GOId == qinfo->RequiredNpcOrGo[j] && qs.CreatureOrGOCount[j] < qinfo->RequiredNpcOrGoCount[j])
12363 return true;
12364 }
12365 }
12366 }
12367 return false;
12368}
Difficulty GetDifficulty(bool isRaid) const
Definition: Player.h:1896
bool IsAllowedInRaid(Difficulty difficulty) const
Definition: QuestDef.cpp:296

References QuestStatusData::CreatureOrGOCount, GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::IsAllowedInRaid(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::ActivateToQuest().

◆ HasQuestForItem()

bool Player::HasQuestForItem ( uint32  itemId,
uint32  excludeQuestId = 0,
bool  turnIn = false,
bool *  showInLoot = nullptr 
) const
2259{
2260 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2261 {
2262 uint32 questid = GetQuestSlotQuestId(i);
2263 if (questid == 0 || questid == excludeQuestId)
2264 continue;
2265
2266 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
2267 if (qs_itr == m_QuestStatus.end())
2268 continue;
2269
2270 QuestStatusData const& q_status = qs_itr->second;
2271
2272 if ((q_status.Status == QUEST_STATUS_INCOMPLETE) || (turnIn && q_status.Status == QUEST_STATUS_COMPLETE))
2273 {
2274 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
2275 if (!qinfo)
2276 continue;
2277
2278 // hide quest if player is in raid-group and quest is no raid quest
2279 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
2280 {
2281 if (!InBattleground() && !GetGroup()->isBFGroup()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
2282 {
2283 continue;
2284 }
2285 }
2286
2287 // There should be no mixed ReqItem/ReqSource drop
2288 // This part for ReqItem drop
2289 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
2290 {
2291 if (itemid == qinfo->RequiredItemId[j] && q_status.ItemCount[j] < qinfo->RequiredItemCount[j])
2292 {
2293 if (showInLoot)
2294 {
2295 if (GetItemCount(itemid, true) < qinfo->RequiredItemCount[j])
2296 {
2297 return true;
2298 }
2299
2300 *showInLoot = false;
2301 }
2302 else
2303 {
2304 return true;
2305 }
2306 }
2307
2308 if (turnIn && q_status.ItemCount[j] >= qinfo->RequiredItemCount[j])
2309 {
2310 return true;
2311 }
2312 }
2313 // This part - for ReqSource
2314 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
2315 {
2316 // examined item is a source item
2317 if (qinfo->ItemDrop[j] == itemid)
2318 {
2319 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
2320 uint32 ownedCount = GetItemCount(itemid, true);
2321 // 'unique' item
2322 if ((pProto->MaxCount && int32(ownedCount) < pProto->MaxCount) || (turnIn && int32(ownedCount) >= pProto->MaxCount))
2323 return true;
2324
2325 // allows custom amount drop when not 0
2326 if (qinfo->ItemDropQuantity[j])
2327 {
2328 if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j]))
2329 return true;
2330 }
2331 else if (ownedCount < pProto->GetMaxStackSize())
2332 return true;
2333 }
2334 }
2335 }
2336 }
2337 return false;
2338}
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:302
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:301
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:299

References GetDifficulty(), GetGroup(), GetItemCount(), WorldObject::GetMap(), GetQuestSlotQuestId(), InBattleground(), Quest::IsAllowedInRaid(), QuestStatusData::ItemCount, Quest::ItemDrop, Quest::ItemDropQuantity, m_QuestStatus, MAX_QUEST_LOG_SIZE, ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and QuestStatusData::Status.

Referenced by LootItem::AllowedForPlayer(), LootTemplate::HasQuestDropForPlayer(), LootTemplate::LootGroup::HasQuestDropForPlayer(), at_twilight_grove::OnTrigger(), and RewardQuest().

◆ HasReceivedSpectatorResetFor()

bool Player::HasReceivedSpectatorResetFor ( ObjectGuid  guid)
inline

◆ HasRestFlag()

bool Player::HasRestFlag ( RestFlag  restFlag) const
inline
1196{ return (_restFlagMask & restFlag) != 0; }

References _restFlagMask.

Referenced by Update().

◆ HasSkill()

◆ hasSpanishClient()

bool Player::hasSpanishClient ( )
inline
1085 {
1087 }
@ LOCALE_esES
Definition: Common.h:71
@ LOCALE_esMX
Definition: Common.h:72
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:498

References GetSession(), WorldSession::GetSessionDbLocaleIndex(), LOCALE_esES, and LOCALE_esMX.

◆ HasSpell()

bool Player::HasSpell ( uint32  spell) const
overridevirtual

Reimplemented from Unit.

3859{
3860 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3861 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3862}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), AddSpellAndCategoryCooldowns(), LootItem::AllowedForPlayer(), AuctionHouseObject::BuildListAuctionItems(), canCreateExtraItems(), CanCreatePerfectItem(), canFlyInZone(), Group::CanJoinBattlegroundQueue(), npc_engineering_tele_trinket::CanLearn(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::EffectCastButtons(), GetExplicitDiscoverySpell(), GetResurrectionSpellId(), GetSkillDiscoverySpell(), GetStartPosition(), GetTrainerSpellState(), WorldSession::HandleBattlemasterJoinOpcode(), Acore::PlayerCommand::HandleLearnSpellCommand(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleTrainerBuySpellOpcode(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), npc_prof_alchemy::HasAlchemySpell(), HasDiscoveredAllSpells(), npc_prof_leather::HasLeatherSpecialty(), go_evil_book_for_dummies::HasLeatherSpecialty(), npc_prof_tailor::HasTailorSpell(), npc_prof_blacksmith::HasWeaponSub(), IsActionButtonDataValid(), Creature::IsValidTrainerForPlayer(), learnQuestRewardedSpells(), boss_gloomrel::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), ProcessCastaction(), resetTalents(), WorldSession::SendTrainerList(), and TeleportTo().

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

bool Player::HasSpellItemCooldown ( uint32  spell_id,
uint32  itemid 
) const
overridevirtual

Reimplemented from Unit.

16289{
16290 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16291 return itr != m_spellCooldowns.end() && itr->second.end > getMSTime() && itr->second.itemid == itemid;
16292}

References getMSTime(), and m_spellCooldowns.

◆ HasSpellMod()

bool Player::HasSpellMod ( SpellModifier mod,
Spell spell 
)
9661{
9662 if (!mod || !spell)
9663 return false;
9664
9665 return spell->m_appliedMods.find(mod->ownerAura) != spell->m_appliedMods.end();
9666}

References Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ HasTalent()

bool Player::HasTalent ( uint32  spell_id,
uint8  spec 
) const
3865{
3866 PlayerTalentMap::const_iterator itr = m_talents.find(spell);
3867 return (itr != m_talents.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3868}

References m_activeSpec, m_talents, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), GetSpec(), AuraEffect::HandleShapeshiftBoosts(), and LearnTalent().

◆ HasTankSpec()

bool Player::HasTankSpec ( )
16018{
16019 switch (GetSpec())
16020 {
16024 return true;
16027 return true;
16028 break;
16029 default:
16030 break;
16031 }
16032 return false;
16033}
@ TALENT_TREE_DEATH_KNIGHT_BLOOD
Definition: Player.h:160
@ TALENT_TREE_PALADIN_PROTECTION
Definition: Player.h:149
@ TALENT_TREE_WARRIOR_PROTECTION
Definition: Player.h:147
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_BEAR
Definition: UnitDefines.h:74

References FORM_BEAR, FORM_DIREBEAR, Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_BLOOD, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_PROTECTION, and TALENT_TREE_WARRIOR_PROTECTION.

◆ HasTitle() [1/2]

bool Player::HasTitle ( CharTitlesEntry const *  title) const
inline
2518{ return HasTitle(title->bit_index); }
bool HasTitle(uint32 bitIndex) const
Definition: Player.cpp:13272

References CharTitlesEntry::bit_index, and HasTitle().

Referenced by HasTitle().

◆ HasTitle() [2/2]

bool Player::HasTitle ( uint32  bitIndex) const
13273{
13274 if (bitIndex > MAX_TITLE_INDEX)
13275 return false;
13276
13277 uint32 fieldIndexOffset = bitIndex / 32;
13278 uint32 flag = 1 << (bitIndex % 32);
13279 return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13280}
#define MAX_TITLE_INDEX
Definition: Player.h:554

References Object::HasFlag(), MAX_TITLE_INDEX, and PLAYER__FIELD_KNOWN_TITLES.

Referenced by character_commandscript::HandleCharacterTitlesCommand(), lookup_commandscript::HandleLookupTitleCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), LoadFromDB(), and AchievementCriteriaData::Meets().

◆ HaveAtClient() [1/2]

bool Player::HaveAtClient ( ObjectGuid  guid) const
11384{
11385 if (guid == GetGUID())
11386 {
11387 return true;
11388 }
11389
11390 return m_clientGUIDs.find(guid) != m_clientGUIDs.end();
11391}
GuidUnorderedSet m_clientGUIDs
Definition: Player.h:2357

References Object::GetGUID(), and m_clientGUIDs.

◆ HaveAtClient() [2/2]

bool Player::HaveAtClient ( WorldObject const *  u) const
11365{
11366 if (u == this)
11367 {
11368 return true;
11369 }
11370
11371 // Motion Transports are always present in player's client
11372 if (GameObject const* gameobject = u->ToGameObject())
11373 {
11374 if (gameobject->IsMotionTransport())
11375 {
11376 return true;
11377 }
11378 }
11379
11380 return m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
11381}

References Object::GetGUID(), m_clientGUIDs, and Object::ToGameObject().

Referenced by Group::AddMember(), WorldObjectChangeAccumulator::BuildPacket(), WorldObject::DestroyForNearbyPlayers(), ArenaSpectator::HandleSpectatorWatchCommand(), Map::SendInitSelf(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SetOwnerGUID(), and UpdateVisibilityOf().

◆ InArena()

bool Player::InArena ( ) const
12250{
12252 if (!bg || !bg->isArena())
12253 return false;
12254
12255 return true;
12256}
bool isArena() const
Definition: Battleground.h:396

References GetBattleground(), and Battleground::isArena().

Referenced by CreateCorpse(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleUseItemOpcode(), achievement_arena_by_type::OnCheck(), RewardHonor(), and AuraEffect::UpdatePeriodic().

◆ InBattleground()

◆ InBattlegroundQueue()

bool Player::InBattlegroundQueue ( bool  ignoreArena = false) const

◆ InBattlegroundQueueForBattlegroundQueueType()

bool Player::InBattlegroundQueueForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12192{
12194}
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Definition: Player.cpp:12173

References GetBattlegroundQueueIndex(), and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by Group::CanJoinBattlegroundQueue(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ IncompleteQuest()

◆ InitDataForForm()

void Player::InitDataForForm ( bool  reapplyMods = false)
10526{
10528
10529 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
10530 if (ssEntry && ssEntry->attackSpeed)
10531 {
10535 }
10536 else
10538
10539 switch (form)
10540 {
10541 case FORM_GHOUL:
10542 case FORM_CAT:
10543 {
10544 if (getPowerType() != POWER_ENERGY)
10546 break;
10547 }
10548 case FORM_BEAR:
10549 case FORM_DIREBEAR:
10550 {
10551 if (getPowerType() != POWER_RAGE)
10553 break;
10554 }
10555 default: // 0, for example
10556 {
10557 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass());
10558 if (cEntry && cEntry->powerType < MAX_POWERS && uint32(getPowerType()) != cEntry->powerType)
10559 setPowerType(Powers(cEntry->powerType));
10560 break;
10561 }
10562 }
10563
10564 // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change.
10565 if (!reapplyMods)
10567
10570}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
ShapeshiftForm
Definition: UnitDefines.h:68
@ FORM_GHOUL
Definition: UnitDefines.h:76
void SetRegularAttackTime()
Definition: Player.cpp:5236
void UpdateEquipSpellsAtFormChange()
Definition: PlayerUpdates.cpp:1309
void setPowerType(Powers power)
Definition: Unit.cpp:9921
Definition: DBCStructure.h:1817
uint32 attackSpeed
Definition: DBCStructure.h:1825

References SpellShapeshiftFormEntry::attackSpeed, BASE_ATTACK, BASE_ATTACK_TIME, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_GHOUL, Unit::getClass(), Unit::getPowerType(), Unit::GetShapeshiftForm(), MAX_POWERS, OFF_ATTACK, POWER_ENERGY, POWER_RAGE, ChrClassesEntry::powerType, RANGED_ATTACK, sChrClassesStore, Unit::SetAttackTime(), Unit::setPowerType(), SetRegularAttackTime(), sSpellShapeshiftFormStore, UpdateAttackPowerAndDamage(), and UpdateEquipSpellsAtFormChange().

Referenced by AuraEffect::HandleAuraModShapeshift(), and InitStatsForLevel().

◆ InitDisplayIds()

void Player::InitDisplayIds ( )
10573{
10574 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
10575 if (!info)
10576 {
10577 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString());
10578 return;
10579 }
10580
10581 uint8 gender = getGender();
10582 switch (gender)
10583 {
10584 case GENDER_FEMALE:
10587 break;
10588 case GENDER_MALE:
10591 break;
10592 default:
10593 LOG_ERROR("entities.player", "Invalid gender {} for player", gender);
10594 return;
10595 }
10596}
@ GENDER_MALE
Definition: SharedDefines.h:61
@ GENDER_FEMALE
Definition: SharedDefines.h:62
uint16 displayId_m
Definition: Player.h:345
uint16 displayId_f
Definition: Player.h:346
uint8 getGender() const
Definition: Unit.h:768
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16690
void SetNativeDisplayId(uint32 displayId)
Definition: Unit.h:1515

References PlayerInfo::displayId_f, PlayerInfo::displayId_m, GENDER_FEMALE, GENDER_MALE, Unit::getClass(), Unit::getGender(), Object::GetGUID(), Unit::getRace(), LOG_ERROR, Unit::SetDisplayId(), Unit::SetNativeDisplayId(), sObjectMgr, and Position::ToString().

Referenced by Create(), modify_commandscript::HandleModifyGenderCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), and LoadFromDB().

◆ InitGlyphsForLevel()

void Player::InitGlyphsForLevel ( )
13234{
13235 for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
13236 if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i))
13237 if (gs->Order)
13238 SetGlyphSlot(gs->Order - 1, gs->Id);
13239
13240 uint8 level = GetLevel();
13241 uint32 value = 0;
13242
13243 // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
13244 if (level >= 15)
13245 value |= (0x01 | 0x02);
13246 if (level >= 30)
13247 value |= 0x08;
13248 if (level >= 50)
13249 value |= 0x04;
13250 if (level >= 70)
13251 value |= 0x10;
13252 if (level >= 80)
13253 value |= 0x20;
13254
13256}
@ PLAYER_GLYPHS_ENABLED
Definition: UpdateFields.h:390
void SetGlyphSlot(uint8 slot, uint32 slottype)
Definition: Player.h:1736

References Unit::GetLevel(), PLAYER_GLYPHS_ENABLED, SetGlyphSlot(), Unit::SetUInt32Value(), and sGlyphSlotStore.

Referenced by Create(), GiveLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ Initialize()

void Player::Initialize ( ObjectGuid::LowType  guid)
4796{
4797 Object::_Create(guid, 0, HighGuid::Player);
4798}

References Object::_Create().

◆ InitPrimaryProfessions()

void Player::InitPrimaryProfessions ( )
11463{
11465}
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition: IWorld.h:256

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SetFreePrimaryProfessions(), and sWorld.

Referenced by Create(), and LoadFromDB().

◆ InitRunes()

void Player::InitRunes ( )
13404{
13406 return;
13407
13408 m_runes = new Runes;
13409
13410 m_runes->runeState = 0;
13412
13413 for (uint8 i = 0; i < MAX_RUNES; ++i)
13414 {
13415 SetBaseRune(i, runeSlotTypes[i]); // init base types
13416 SetCurrentRune(i, runeSlotTypes[i]); // init current types
13417 SetRuneCooldown(i, 0); // reset cooldowns
13418 SetGracePeriod(i, 0); // xinef: reset grace period
13419 SetRuneConvertAura(i, nullptr);
13421 }
13422
13423 for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i)
13425}
@ PLAYER_RUNE_REGEN_1
Definition: UpdateFields.h:386
static RuneType runeSlotTypes[MAX_RUNES]
Definition: Player.cpp:13393
@ NUM_RUNE_TYPES
Definition: Player.h:413
@ RUNE_BLOOD
Definition: Player.h:409
#define MAX_RUNES
Definition: Player.h:398
Definition: Player.h:426
void SetRuneState(uint8 index, bool set=true)
Definition: Player.h:431
void SetRuneCooldown(uint8 index, uint32 cooldown)
Definition: Player.h:2492
void SetBaseRune(uint8 index, RuneType baseRune)
Definition: Player.h:2490
void SetGracePeriod(uint8 index, uint32 period)
Definition: Player.h:2493

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, IsClass(), Runes::lastUsedRune, m_runes, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, RUNE_BLOOD, runeSlotTypes, Runes::runeState, SetBaseRune(), SetCurrentRune(), Object::SetFloatValue(), SetGracePeriod(), SetRuneConvertAura(), SetRuneCooldown(), and Runes::SetRuneState().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitStatsForLevel()

void Player::InitStatsForLevel ( bool  reapplyMods = false)
2568{
2569 if (reapplyMods) //reapply stats values only on .reset stats (level) command
2571
2572 PlayerClassLevelInfo classInfo;
2573 sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo);
2574
2575 PlayerLevelInfo info;
2576 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info);
2577
2578 uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
2579 sScriptMgr->OnSetMaxLevel(this, maxPlayerLevel);
2580 SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, maxPlayerLevel);
2582
2583 // reset before any aura state sources (health set/aura apply)
2585
2587
2588 // set default cast time multiplier
2590
2591 // reset size before reapply auras
2592 SetObjectScale(1.0f);
2593
2594 // save base values (bonuses already included in stored stats
2595 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2596 SetCreateStat(Stats(i), info.stats[i]);
2597
2598 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2599 SetStat(Stats(i), info.stats[i]);
2600
2601 SetCreateHealth(classInfo.basehealth);
2602
2603 //set create powers
2604 SetCreateMana(classInfo.basemana);
2605
2607
2609
2610 //reset rating fields values
2612 SetUInt32Value(index, 0);
2613
2615 for (uint8 i = 0; i < 7; ++i)
2616 {
2620 }
2621
2622 //reset attack power, damage and attack speed fields
2624 SetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1, 2000.0f); // offhand attack time
2626
2633
2640
2641 // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2645
2646 // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2647 for (uint8 i = 0; i < 7; ++i)
2649
2653
2654 // Dodge percentage
2656
2657 // set armor (resistance 0) to original value (create_agility*2)
2659 SetResistanceBuffMods(SpellSchools(0), true, 0.0f);
2660 SetResistanceBuffMods(SpellSchools(0), false, 0.0f);
2661 // set other resistance to original value (0)
2662 for (uint8 i = 1; i < MAX_SPELL_SCHOOL; ++i)
2663 {
2665 SetResistanceBuffMods(SpellSchools(i), true, 0.0f);
2666 SetResistanceBuffMods(SpellSchools(i), false, 0.0f);
2667 }
2668
2671 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
2672 {
2675 }
2676 // Reset no reagent cost field
2677 for (uint8 i = 0; i < 3; ++i)
2679 // Init data for form but skip reapply item mods for form
2680 InitDataForForm(reapplyMods);
2681
2682 // save new stats
2683 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
2685
2686 SetMaxHealth(classInfo.basehealth); // stamina bonus will applied later
2687
2688 // cleanup mounted state (it will set correctly at aura loading if player saved at mount.
2690
2691 // cleanup unit flags (will be re-applied if need at aura load).
2699 SetImmuneToAll(false);
2701
2703
2704 // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
2706
2707 RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
2709 {
2711 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2712
2713 }
2714 // restore if need some important flags
2715 SetUInt32Value(PLAYER_FIELD_BYTES2, 0); // flags empty by default
2716
2717 if (reapplyMods) // reapply stats values only on .reset stats (level) command
2719
2720 // set current level health and mana/energy to maximum after applying all mods.
2721 SetFullHealth();
2729
2730 // update level to hunter/summon pet
2731 if (Pet* pet = GetPet())
2732 pet->SynchronizeLevelWithOwner();
2733}
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_POWER_COST_MODIFIER
Definition: UpdateFields.h:170
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
@ PLAYER_SHIELD_BLOCK
Definition: UpdateFields.h:355
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ PLAYER_FIELD_BYTES2
Definition: UpdateFields.h:378
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
@ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT
Definition: UpdateFields.h:362
@ UNIT_FIELD_POWER_COST_MULTIPLIER
Definition: UpdateFields.h:171
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
@ PLAYER_FIELD_MAX_LEVEL
Definition: UpdateFields.h:384
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
@ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE
Definition: UpdateFields.h:367
@ PLAYER_ALLOW_ONLY_ABILITY
Definition: Player.h:497
@ PLAYER_FLAGS_DND
Definition: Player.h:476
@ PLAYER_FLAGS_AFK
Definition: Player.h:475
@ PLAYER_FLAGS_GM
Definition: Player.h:477
@ UNIT_STAND_FLAGS_ALL
Definition: UnitDefines.h:52
@ UNIT_BYTE2_FLAG_FFA_PVP
Definition: UnitDefines.h:117
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition: UnitDefines.h:118
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:247
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:230
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:248
@ UNIT_FLAG_DISARMED
Definition: UnitDefines.h:250
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:246
@ UNIT_FLAG_CONFUSED
Definition: UnitDefines.h:251
@ UNIT_FLAG_FLEEING
Definition: UnitDefines.h:252
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:254
@ UNIT_FLAG_LOOTING
Definition: UnitDefines.h:239
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:236
@ UNIT_FLAG_SILENCED
Definition: UnitDefines.h:242
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:256
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:240
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930
void _ApplyAllStatBonuses()
Definition: StatSystem.cpp:979
void InitDataForForm(bool reapplyMods=false)
Definition: Player.cpp:10525
void _RemoveAllStatBonuses()
Definition: StatSystem.cpp:991
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15587
void SetStat(Stats stat, int32 val)
Definition: Unit.h:773
void SetResistanceBuffMods(SpellSchools school, bool positive, float val)
Definition: Unit.h:1369
float m_createStats[MAX_STATS]
Definition: Unit.h:1828
void SetResistance(SpellSchools school, int32 val)
Definition: Unit.h:779
void RemoveStandFlags(uint8 flags)
Definition: Unit.h:885
void SetArmor(int32 val)
Definition: Unit.h:775
void SetMaxHealth(uint32 val)
Definition: Unit.cpp:15455
void InitStatBuffMods()
Definition: Unit.h:1372
void SetImmuneToAll(bool apply, bool keepCombat=false)
Definition: Unit.h:1022

References _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CONFIG_MAX_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreatePowers(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Object::HasByteFlag(), InitDataForForm(), Unit::InitStatBuffMods(), Unit::m_createStats, MAX_COMBAT_RATING, MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_ALLOW_ONLY_ABILITY, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_BYTES2, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_FIELD_MAX_LEVEL, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE, PLAYER_FIELD_MOD_TARGET_RESISTANCE, PLAYER_FLAGS_AFK, PLAYER_FLAGS_DND, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_GM, PLAYER_NEXT_LEVEL_XP, PLAYER_NO_REAGENT_COST_1, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SHIELD_BLOCK, PLAYER_SPELL_CRIT_PERCENTAGE1, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Object::RemoveByteFlag(), Object::RemoveFlag(), RemovePlayerFlag(), Unit::RemoveStandFlags(), Unit::SetArmor(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Object::SetFloatValue(), Unit::SetFullHealth(), Unit::SetImmuneToAll(), Object::SetInt32Value(), Unit::SetMaxHealth(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetResistance(), Unit::SetResistanceBuffMods(), Unit::SetStat(), Unit::SetUInt32Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), sObjectMgr, sScriptMgr, STAT_AGILITY, STAT_STRENGTH, PlayerLevelInfo::stats, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_FLAGS, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FIELD_POWER_COST_MODIFIER, UNIT_FIELD_POWER_COST_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_DISARMED, UNIT_FLAG_FLEEING, UNIT_FLAG_IN_COMBAT, UNIT_FLAG_LOOTING, UNIT_FLAG_MOUNT, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PACIFIED, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_SILENCED, UNIT_FLAG_SKINNABLE, UNIT_FLAG_STUNNED, UNIT_FLAG_TAXI_FLIGHT, UNIT_MOD_CAST_SPEED, UNIT_STAND_FLAGS_ALL, and UpdateSkillsForLevel().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitTalentForLevel()

void Player::InitTalentForLevel ( )
2553{
2554 uint32 talentPointsForLevel = CalculateTalentsPoints();
2555
2556 // xinef: more talent points that we have are used, reset
2557 if (m_usedTalentCount > talentPointsForLevel)
2558 resetTalents(true);
2559 // xinef: else, recalculate free talent points count
2560 else
2561 SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
2562
2563 if (!GetSession()->PlayerLoading())
2564 SendTalentsInfoData(false); // update at client
2565}
void SendTalentsInfoData(bool pet)
Definition: Player.cpp:14369
bool resetTalents(bool noResetCost=false)
Definition: Player.cpp:3683
void SetFreeTalentPoints(uint32 points)
Definition: Player.cpp:3778
uint32 CalculateTalentsPoints() const
Definition: Player.cpp:13566

References CalculateTalentsPoints(), GetSession(), m_usedTalentCount, resetTalents(), SendTalentsInfoData(), and SetFreeTalentPoints().

Referenced by ActivateSpec(), Create(), GiveLevel(), character_commandscript::HandleCharacterLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), LoadFromDB(), and RewardQuest().

◆ InitTaxiNodesForLevel()

void Player::InitTaxiNodesForLevel ( )
inline

◆ inRandomLfgDungeon()

bool Player::inRandomLfgDungeon ( )
13021{
13022 if (sLFGMgr->selectedRandomLfgDungeon(GetGUID()))
13023 {
13024 Map const* map = GetMap();
13025 return sLFGMgr->inLfgDungeonMap(GetGUID(), map->GetId(), map->GetDifficulty());
13026 }
13027
13028 return false;
13029}

References Map::GetDifficulty(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), and sLFGMgr.

◆ isAcceptWhispers()

bool Player::isAcceptWhispers ( ) const
inline

◆ IsActionButtonDataValid()

bool Player::IsActionButtonDataValid ( uint8  button,
uint32  action,
uint8  type 
)
5523{
5524 if (button >= MAX_ACTION_BUTTONS)
5525 {
5526 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: button must be < {}", action, button, GetName(), MAX_ACTION_BUTTONS);
5527 return false;
5528 }
5529
5530 if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
5531 {
5532 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: action must be < {}", action, button, GetName(), MAX_ACTION_BUTTON_ACTION_VALUE);
5533 return false;
5534 }
5535
5536 switch (type)
5537 {
5539 if (!sSpellMgr->GetSpellInfo(action))
5540 {
5541 LOG_ERROR("entities.player", "Spell action {} not added into button {} for player {}: spell not exist", action, button, GetName());
5542 return false;
5543 }
5544
5545 if (!HasSpell(action))
5546 {
5547 LOG_DEBUG("entities.player.loading", "Player::IsActionButtonDataValid Spell action {} not added into button {} for player {}: player don't known this spell", action, button, GetName());
5548 return false;
5549 }
5550 break;
5551 case ACTION_BUTTON_ITEM:
5552 if (!sObjectMgr->GetItemTemplate(action))
5553 {
5554 LOG_ERROR("entities.player", "Item action {} not added into button {} for player {}: item not exist", action, button, GetName());
5555 return false;
5556 }
5557 break;
5558 default:
5559 break; // other cases not checked at this moment
5560 }
5561
5562 return true;
5563}
@ ACTION_BUTTON_ITEM
Definition: Player.h:234
@ ACTION_BUTTON_SPELL
Definition: Player.h:229
#define MAX_ACTION_BUTTONS
Definition: Player.h:274
#define MAX_ACTION_BUTTON_ACTION_VALUE
Definition: Player.h:250

References ACTION_BUTTON_ITEM, ACTION_BUTTON_SPELL, WorldObject::GetName(), HasSpell(), LOG_DEBUG, LOG_ERROR, MAX_ACTION_BUTTON_ACTION_VALUE, MAX_ACTION_BUTTONS, sObjectMgr, and sSpellMgr.

Referenced by addActionButton().

◆ IsActiveQuest()

bool Player::IsActiveQuest ( uint32  quest_id) const
203{
204 return m_QuestStatus.find(quest_id) != m_QuestStatus.end();
205}

References m_QuestStatus.

◆ IsAffectedBySpellmod()

bool Player::IsAffectedBySpellmod ( SpellInfo const *  spellInfo,
SpellModifier mod,
Spell spell = nullptr 
)
9669{
9670 if (!mod || !spellInfo)
9671 return false;
9672
9673 // Mod out of charges
9674 if (spell && mod->charges == -1 && spell->m_appliedMods.find(mod->ownerAura) == spell->m_appliedMods.end())
9675 return false;
9676
9677 // +duration to infinite duration spells making them limited
9678 if (mod->op == SPELLMOD_DURATION && spellInfo->GetDuration() == -1)
9679 return false;
9680
9681 return spellInfo->IsAffectedBySpellMod(mod);
9682}

References SpellModifier::charges, SpellInfo::GetDuration(), SpellInfo::IsAffectedBySpellMod(), Spell::m_appliedMods, SpellModifier::op, SpellModifier::ownerAura, and SPELLMOD_DURATION.

Referenced by ApplySpellMod().

◆ isAFK()

◆ isAllowedToLoot()

bool Player::isAllowedToLoot ( Creature const *  creature)
5636{
5637 if (!creature->isDead() || !creature->IsDamageEnoughForLootingAndReward())
5638 return false;
5639
5640 if (HasPendingBind())
5641 return false;
5642
5643 const Loot* loot = &creature->loot;
5644 if (loot->isLooted()) // nothing to loot or everything looted.
5645 return false;
5646
5647 if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player
5648 return false;
5649
5650 if (loot->loot_type == LOOT_SKINNING)
5651 return creature->GetLootRecipientGUID() == GetGUID();
5652
5653 Group* thisGroup = GetGroup();
5654 if (!thisGroup)
5655 return this == creature->GetLootRecipient();
5656 else if (thisGroup != creature->GetLootRecipientGroup())
5657 return false;
5658
5659 switch (thisGroup->GetLootMethod())
5660 {
5661 case MASTER_LOOT:
5662 case FREE_FOR_ALL:
5663 return true;
5664 case ROUND_ROBIN:
5665 // may only loot if the player is the loot roundrobin player
5666 // or if there are free/quest/conditional item for the player
5667 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5668 return true;
5669
5670 return loot->hasItemFor(this);
5671 case GROUP_LOOT:
5672 case NEED_BEFORE_GREED:
5673 // may only loot if the player is the loot roundrobin player
5674 // or item over threshold (so roll(s) can be launched)
5675 // or if there are free/quest/conditional item for the player
5676 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5677 return true;
5678
5679 if (loot->hasOverThresholdItem())
5680 return true;
5681
5682 return loot->hasItemFor(this);
5683 }
5684
5685 return false;
5686}
@ NEED_BEFORE_GREED
Definition: LootMgr.h:63
@ GROUP_LOOT
Definition: LootMgr.h:62
@ MASTER_LOOT
Definition: LootMgr.h:61
@ ROUND_ROBIN
Definition: LootMgr.h:60
@ FREE_FOR_ALL
Definition: LootMgr.h:59
@ LOOT_SKINNING
Definition: LootMgr.h:86
bool HasPendingBind() const
Definition: Player.h:2415
LootMethod GetLootMethod() const
Definition: Group.cpp:2316
bool hasItemFor(Player *player) const
Definition: LootMgr.cpp:928
bool isLooted() const
Definition: LootMgr.h:368
bool hasOverThresholdItem() const
Definition: LootMgr.cpp:973
ObjectGuid roundRobinPlayer
Definition: LootMgr.h:324
bool hasItemForAll() const
Definition: LootMgr.cpp:913
LootType loot_type
Definition: LootMgr.h:326

References FREE_FOR_ALL, GetGroup(), Object::GetGUID(), Group::GetLootMethod(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GROUP_LOOT, Loot::hasItemFor(), Loot::hasItemForAll(), Loot::hasOverThresholdItem(), HasPendingBind(), Creature::IsDamageEnoughForLootingAndReward(), Unit::isDead(), Loot::isLooted(), Creature::loot, LOOT_SKINNING, Loot::loot_type, MASTER_LOOT, NEED_BEFORE_GREED, ROUND_ROBIN, and Loot::roundRobinPlayer.

Referenced by Unit::PatchValuesUpdate().

◆ IsAlwaysDetectableFor()

bool Player::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11418{
11420 return true;
11421
11422 if (duel && duel->State != DUEL_STATE_CHALLENGED && duel->Opponent == seer)
11423 {
11424 return false;
11425 }
11426
11427 if (Player const* seerPlayer = seer->ToPlayer())
11428 {
11429 if (IsGroupVisibleFor(seerPlayer))
11430 {
11431 return true;
11432 }
11433 }
11434
11435 return false;
11436}
@ DUEL_STATE_CHALLENGED
Definition: Player.h:370
bool IsGroupVisibleFor(Player const *p) const
Definition: Player.cpp:2294
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition: Unit.cpp:14143

References duel, DUEL_STATE_CHALLENGED, Unit::IsAlwaysDetectableFor(), IsGroupVisibleFor(), and Object::ToPlayer().

◆ IsAtGroupRewardDistance()

bool Player::IsAtGroupRewardDistance ( WorldObject const *  pRewardSource) const
12710{
12711 WorldObject const* player = GetCorpse();
12712 if (!player || IsAlive())
12713 {
12714 player = this;
12715 }
12716
12717 if (!pRewardSource || !player->IsInMap(pRewardSource))
12718 {
12719 return false;
12720 }
12721
12722 if (pRewardSource->GetMap()->IsDungeon())
12723 {
12724 return true;
12725 }
12726
12727 return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
12728}
@ CONFIG_GROUP_XP_DISTANCE
Definition: IWorld.h:196
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1245

References CONFIG_GROUP_XP_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetMap(), Unit::IsAlive(), Map::IsDungeon(), WorldObject::IsInMap(), and sWorld.

Referenced by KillRewarder::_InitGroupData(), KillRewarder::_RewardGroup(), SmartAI::EndPath(), GroupEventHappens(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), IsAtLootRewardDistance(), Group::NeedBeforeGreed(), and RewardPlayerAndGroupAtEvent().

◆ IsAtLootRewardDistance()

bool Player::IsAtLootRewardDistance ( WorldObject const *  pRewardSource) const
12731{
12732 if (!IsAtGroupRewardDistance(pRewardSource))
12733 {
12734 return false;
12735 }
12736
12737 if (HasPendingBind())
12738 {
12739 return false;
12740 }
12741
12742 return pRewardSource->HasAllowedLooter(GetGUID());
12743}

References Object::GetGUID(), WorldObject::HasAllowedLooter(), HasPendingBind(), and IsAtGroupRewardDistance().

Referenced by Loot::FillLoot(), Group::GroupLoot(), WorldSession::HandleLootMoneyOpcode(), Group::MasterLoot(), and Group::UpdateLooterGuid().

◆ IsAtRecruitAFriendDistance()

bool Player::IsAtRecruitAFriendDistance ( WorldObject const *  pOther) const
12746{
12747 if (!pOther)
12748 return false;
12749 WorldObject const* player = GetCorpse();
12750 if (!player || IsAlive())
12751 player = this;
12752
12753 if (player->GetMapId() != pOther->GetMapId() || player->GetInstanceId() != pOther->GetInstanceId())
12754 return false;
12755
12756 return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
12757}
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition: IWorld.h:197

References CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::IsAlive(), and sWorld.

Referenced by GetsRecruitAFriendBonus().

◆ IsBagPos()

bool Player::IsBagPos ( uint16  pos)
static

◆ IsBankPos() [1/2]

◆ IsBankPos() [2/2]

bool Player::IsBankPos ( uint8  bag,
uint8  slot 
)
static
603{
604 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END))
605 return true;
606 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
607 return true;
608 if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
609 return true;
610 return false;
611}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, and INVENTORY_SLOT_BAG_0.

◆ IsBaseRuneSlotsOnCooldown()

bool Player::IsBaseRuneSlotsOnCooldown ( RuneType  runeType) const
13428{
13429 for (uint8 i = 0; i < MAX_RUNES; ++i)
13430 if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0)
13431 return false;
13432
13433 return true;
13434}
uint32 GetRuneCooldown(uint8 index) const
Definition: Player.h:2484

References GetBaseRune(), GetRuneCooldown(), and MAX_RUNES.

Referenced by Unit::HandleProcTriggerSpell().

◆ isBeingLoaded()

bool Player::isBeingLoaded ( ) const
overridevirtual

Reimplemented from Unit.

4929{
4930 return GetSession()->PlayerLoading();
4931}
bool PlayerLoading() const
Definition: WorldSession.h:337

References GetSession(), and WorldSession::PlayerLoading().

Referenced by _addSpell(), addTalent(), MapInstanced::CreateInstanceForPlayer(), SendInitialPacketsAfterAddToMap(), SetHonorPoints(), SetMover(), and UpdateObjectVisibility().

◆ IsBeingTeleported()

◆ IsBeingTeleportedFar()

bool Player::IsBeingTeleportedFar ( ) const
inline

◆ IsBeingTeleportedNear()

bool Player::IsBeingTeleportedNear ( ) const
inline

◆ IsClass()

bool Player::IsClass ( Classes  playerClass,
ClassContext  context = CLASS_CONTEXT_NONE 
) const
overridevirtual

Reimplemented from Unit.

1280{
1281 Optional<bool> scriptResult = sScriptMgr->OnPlayerIsClass(this, unitClass, context);
1282 if (scriptResult != std::nullopt)
1283 return *scriptResult;
1284 else
1285 return (getClass() == unitClass);
1286}

References Unit::getClass(), and sScriptMgr.

Referenced by _ApplyItemBonuses(), ActivateSpec(), ActivateTaxiPathTo(), AddSpellMod(), ApplyEnchantment(), CalculateTalentsPoints(), Group::CanJoinBattlegroundQueue(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::CheckRuneCost(), Create(), WorldSession::DoLootRelease(), DuelComplete(), Spell::EffectActivateRune(), Spell::EffectSummonPet(), EquipItem(), spell_class_call_handler::FilterTargets(), FindEquipSlot(), Graveyard::GetClosestGraveyard(), GetNPCIfCanInteractWith(), spell_gen_on_tournament_mount::GetPennatSpellId(), GetStartPosition(), AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), spell_item_refocus::HandleDummy(), WorldSession::HandleLootMoneyOpcode(), AuraEffect::HandlePeriodicDummyAuraTick(), Unit::HandleProcTriggerSpell(), reset_commandscript::HandleResetLevelCommand(), spell_gen_pet_summoned::HandleScript(), ArenaSpectator::HandleSpectatorSpectateCommand(), InitRunes(), Creature::isCanTrainingAndResetTalentsOf(), Pet::IsPermanentPetFor(), Creature::IsValidTrainerForPlayer(), LearnDefaultSkill(), Pet::LoadPetFromDB(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), PrepareGossipMenu(), RegenerateAll(), TeleportTo(), UpdateAttackPowerAndDamage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ IsCommentator()

bool Player::IsCommentator ( ) const
inline
@ PLAYER_FLAGS_COMMENTATOR2
Definition: Player.h:496

References HasPlayerFlag(), and PLAYER_FLAGS_COMMENTATOR2.

Referenced by GetChatTag(), and misc_commandscript::HandleCommentatorCommand().

◆ IsCurrentBattlegroundRandom()

bool Player::IsCurrentBattlegroundRandom ( ) const
inline
2234{ return m_bgData.bgIsRandom; }
bool bgIsRandom
Definition: Player.h:1039

References BGData::bgIsRandom, and m_bgData.

◆ IsDailyQuestDone()

bool Player::IsDailyQuestDone ( uint32  quest_id)
12069{
12070 if (sObjectMgr->GetQuestTemplate(quest_id))
12071 {
12072 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12073 {
12074 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx) == quest_id)
12075 {
12076 return true;
12077 }
12078 }
12079 }
12080
12081 return false;
12082}

References Object::GetUInt32Value(), PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and sObjectMgr.

◆ IsDeserter()

bool Player::IsDeserter ( ) const
inline
2240{ return HasAura(26013); }

References Unit::HasAura().

◆ IsDeveloper()

bool Player::IsDeveloper ( ) const
inline
@ PLAYER_FLAGS_DEVELOPER
Definition: Player.h:489

References HasPlayerFlag(), and PLAYER_FLAGS_DEVELOPER.

Referenced by GetChatTag(), and misc_commandscript::HandleDevCommand().

◆ isDND()

◆ IsEquipmentPos() [1/2]

◆ IsEquipmentPos() [2/2]

bool Player::IsEquipmentPos ( uint8  bag,
uint8  slot 
)
static
594{
595 if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
596 return true;
598 return true;
599 return false;
600}

References EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, and INVENTORY_SLOT_BAG_START.

◆ IsExistPet()

bool Player::IsExistPet ( )
9152{
9153 PetStable* const petStable = GetPetStable();
9154 return petStable && (petStable->CurrentPet || petStable->GetUnslottedHunterPet());
9155}

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

Referenced by CreatePet(), npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ IsFalling()

bool Player::IsFalling ( ) const
2156{
2157 // Xinef: Added !IsInFlight check
2158 return GetPositionZ() < m_lastFallZ && !IsInFlight();
2159}

References Position::GetPositionZ(), Unit::IsInFlight(), and m_lastFallZ.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsFFAPvP()

bool Player::IsFFAPvP ( )
16170{
16171 bool result = Unit::IsFFAPvP();
16172
16173 sScriptMgr->OnIsFFAPvP(this, result);
16174
16175 return result;
16176}
bool IsFFAPvP() const
Definition: Unit.h:863

References Unit::IsFFAPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), WorldSession::HandleRequestPartyMemberStatsOpcode(), RewardHonor(), UpdateFFAPvPFlag(), and UpdateFFAPvPState().

◆ IsGameMaster()

bool Player::IsGameMaster ( ) const
inline
1157{ return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
@ PLAYER_EXTRA_GM_ON
Definition: Player.h:585

References m_ExtraFlags, and PLAYER_EXTRA_GM_ON.

Referenced by ThreatMgr::_addThreat(), Group::_homebindIfInstance(), Unit::_IsValidAssistTarget(), Unit::_IsValidAttackTarget(), Unit::Attack(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), InstanceMap::CannotEnter(), CanTameExoticPets(), Spell::CheckCast(), CheckInstanceLoginValid(), SpellInfo::CheckTarget(), AchievementMgr::CompletedAchievement(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), spell_class_call_polymorph::FilterTargets(), GetPhaseMaskForSpawn(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattlemasterJoinOpcode(), HandleFall(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInspectOpcode(), WorldSession::HandleMessagechatOpcode(), mmaps_commandscript::HandleMmapPathCommand(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), tele_commandscript::HandleTeleCommand(), IsValidCombatTarget(), ThreatCalcHelper::isValidProcess(), WorldSession::LogoutPlayer(), MailSender::MailSender(), npc_ouro_spawner::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_barnes::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), at_trigger_the_beast_movement::OnTrigger(), at_the_beast_room::OnTrigger(), at_ancient_leaf::OnTrigger(), at_lady_deathwhisper_entrance::OnTrigger(), at_icc_gauntlet_event::OnTrigger(), at_icc_putricide_trap::OnTrigger(), at_hor_shadow_throne::OnTrigger(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Unit::PatchValuesUpdate(), MapMgr::PlayerCannotEnter(), Unit::ProcessTerrainStatusUpdate(), Battleground::RemovePlayerAtLeave(), boss_kologarn_pit_kill_bunny::Reset(), AchievementMgr::ResetAchievementCriteria(), Satisfy(), npc_minigob_manabonk::SelectTargetInDalaran(), WorldSession::SendListInventory(), Spell::SendLoot(), SetIsSpectator(), Unit::TauntApply(), Unit::TauntFadeOut(), TeleportTo(), ToggleAFK(), AchievementMgr::UpdateAchievementCriteria(), boss_nefarian::UpdateAI(), UpdateFFAPvPState(), UpdateHomebindTime(), and Whisper().

◆ isGMChat()

bool Player::isGMChat ( ) const
inline
@ PLAYER_EXTRA_GM_CHAT
Definition: Player.h:589

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by GetChatTag().

◆ isGMVisible()

bool Player::isGMVisible ( ) const
inline
@ PLAYER_EXTRA_GM_INVISIBLE
Definition: Player.h:588

References m_ExtraFlags, and PLAYER_EXTRA_GM_INVISIBLE.

Referenced by gm_commandscript::HandleGMVisibleCommand(), and Channel::Invite().

◆ IsGroupVisibleFor()

bool Player::IsGroupVisibleFor ( Player const *  p) const
2295{
2296 switch (sWorld->getIntConfig(CONFIG_GROUP_VISIBILITY))
2297 {
2298 default:
2299 return IsInSameGroupWith(p);
2300 case 1:
2301 return IsInSameRaidWith(p);
2302 case 2:
2303 return GetTeamId() == p->GetTeamId();
2304 }
2305}
@ CONFIG_GROUP_VISIBILITY
Definition: IWorld.h:266
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1862
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2307

References CONFIG_GROUP_VISIBILITY, GetTeamId(), IsInSameGroupWith(), IsInSameRaidWith(), and sWorld.

Referenced by IsAlwaysDetectableFor().

◆ isHonorOrXPTarget()

bool Player::isHonorOrXPTarget ( Unit victim) const
12614{
12615 uint8 v_level = victim->GetLevel();
12617
12618 // Victim level less gray level
12619 if (v_level <= k_grey)
12620 {
12621 return false;
12622 }
12623
12624 if (victim->GetTypeId() == TYPEID_UNIT)
12625 {
12626 if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP))
12627 {
12628 return false;
12629 }
12630 }
12631
12632 return true;
12633}
@ CREATURE_FLAG_EXTRA_NO_XP
Definition: CreatureData.h:52
uint32 flags_extra
Definition: CreatureData.h:249
bool IsCritter() const
Definition: Unit.h:1018
bool IsTotem() const
Definition: Unit.h:756

References CREATURE_FLAG_EXTRA_NO_XP, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Object::GetTypeId(), Unit::IsCritter(), Unit::IsPet(), Unit::IsTotem(), Object::ToCreature(), and TYPEID_UNIT.

Referenced by spell_warl_drain_soul::HandleTick(), Unit::IsTriggeredAtSpellProcEvent(), achievement_killed_exp_or_honor_target::OnCheck(), RaiseDeadCheck::operator()(), spell_warl_drain_soul::RemoveEffect(), and spell_warl_shadowburn::RemoveEffect().

◆ IsImmuneToEnvironmentalDamage()

bool Player::IsImmuneToEnvironmentalDamage ( )
748{
749 // check for GM and death state included in isAttackableByAOE
750 return (!isTargetableForAttack(false, nullptr)) || isTotalImmune();
751}
bool isTargetableForAttack(bool checkFakeDeath=true, Unit const *byWho=nullptr) const
Definition: Unit.cpp:13783

References Unit::isTargetableForAttack(), and isTotalImmune().

Referenced by EnvironmentalDamage().

◆ IsInAreaTriggerRadius()

bool Player::IsInAreaTriggerRadius ( AreaTrigger const *  trigger,
float  delta = 0.f 
) const
2183{
2184 if (!trigger || GetMapId() != trigger->map)
2185 return false;
2186
2187 if (trigger->radius > 0)
2188 {
2189 // if we have radius check it
2190 float dist = GetDistance(trigger->x, trigger->y, trigger->z);
2191 if (dist > trigger->radius + delta)
2192 return false;
2193 }
2194 else
2195 {
2196 Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);
2197 if (!IsWithinBox(center, trigger->length / 2 + delta, trigger->width / 2 + delta, trigger->height / 2 + delta))
2198 return false;
2199 }
2200
2201 return true;
2202}
Definition: Position.h:28
bool IsWithinBox(const Position &center, float xradius, float yradius, float zradius) const
Definition: Position.cpp:110

References WorldObject::GetDistance(), WorldLocation::GetMapId(), AreaTrigger::height, Position::IsWithinBox(), AreaTrigger::length, AreaTrigger::map, AreaTrigger::orientation, AreaTrigger::radius, AreaTrigger::width, AreaTrigger::x, AreaTrigger::y, and AreaTrigger::z.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Update().

◆ IsInSameGroupWith()

bool Player::IsInSameGroupWith ( Player const *  p) const
2308{
2309 return p == this || (GetGroup() &&
2310 GetGroup() == p->GetGroup() &&
2311 GetGroup()->SameSubGroup(this, p));
2312}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition: Group.cpp:2363

References GetGroup(), and Group::SameSubGroup().

Referenced by IsGroupVisibleFor(), and Unit::IsInPartyWith().

◆ IsInSameRaidWith()

◆ IsInventoryPos() [1/2]

◆ IsInventoryPos() [2/2]

bool Player::IsInventoryPos ( uint8  bag,
uint8  slot 
)
static
581{
582 if (bag == INVENTORY_SLOT_BAG_0 && slot == NULL_SLOT)
583 return true;
585 return true;
587 return true;
588 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))
589 return true;
590 return false;
591}

References CURRENCYTOKEN_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and NULL_SLOT.

◆ IsInvitedForBattlegroundInstance() [1/2]

bool Player::IsInvitedForBattlegroundInstance ( ) const
inline
2233{ return m_bgData.isInvited; }
bool isInvited
Definition: Player.h:1038

References BGData::isInvited, and m_bgData.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::LogoutPlayer().

◆ IsInvitedForBattlegroundInstance() [2/2]

bool Player::IsInvitedForBattlegroundInstance ( uint32  instanceId) const
12241{
12242 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12243 if (_BgBattlegroundQueueID[i].invitedToInstance == instanceId)
12244 return true;
12245
12246 return false;
12247}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

◆ IsInvitedForBattlegroundQueueType()

bool Player::IsInvitedForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12183{
12184 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12185 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12186 return _BgBattlegroundQueueID[i].invitedToInstance != 0;
12187
12188 return false;
12189}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattleFieldPortOpcode().

◆ IsInWater()

bool Player::IsInWater ( ) const
inlineoverridevirtual

Reimplemented from Unit.

1118{ return m_isInWater; }

References m_isInWater.

Referenced by WorldSession::HandleMovementOpcodes().

◆ IsInWhisperWhiteList()

bool Player::IsInWhisperWhiteList ( ObjectGuid  guid)
15840{
15841 for (auto const& itr : WhisperList)
15842 {
15843 if (itr == guid)
15844 {
15845 return true;
15846 }
15847 }
15848
15849 return false;
15850}

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ IsMaxLevel()

bool Player::IsMaxLevel ( ) const

◆ IsMirrorTimerActive()

bool Player::IsMirrorTimerActive ( MirrorTimerType  type)
inline
2037{ return m_MirrorTimer[type] == getMaxTimer(type); }

References getMaxTimer(), and m_MirrorTimer.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsNeedCastPassiveSpellAtLearn()

bool Player::IsNeedCastPassiveSpellAtLearn ( SpellInfo const *  spellInfo) const
3262{
3263 // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell
3264 // talent dependent passives activated at form apply have proper stance data
3266 return (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
3267 (!form && spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)));
3268}
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED
Definition: SharedDefines.h:475

References Unit::GetShapeshiftForm(), SpellInfo::HasAttribute(), SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, and SpellInfo::Stances.

Referenced by _addSpell(), and _addTalentAurasAndSpells().

◆ IsNeverVisible()

bool Player::IsNeverVisible ( ) const
overridevirtual

Reimplemented from WorldObject.

11394{
11396 return true;
11397
11398 if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
11399 return true;
11400
11401 return false;
11402}
virtual bool IsNeverVisible() const
Definition: Object.h:660

References GetSession(), and WorldObject::IsNeverVisible().

◆ IsOutdoorPvPActive()

bool Player::IsOutdoorPvPActive ( )

◆ IsPetNeedBeTemporaryUnsummoned()

bool Player::IsPetNeedBeTemporaryUnsummoned ( ) const
inline

◆ IsPvP()

bool Player::IsPvP ( )
16179{
16180 bool result = Unit::IsPvP();
16181
16182 sScriptMgr->OnIsPvP(this, result);
16183
16184 return result;
16185}
bool IsPvP() const
Definition: Unit.h:862

References Unit::IsPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), DuelComplete(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleRequestPartyMemberStatsOpcode(), IsOutdoorPvPActive(), UpdatePvPFlag(), and UpdatePvPState().

◆ IsQuestRewarded()

bool Player::IsQuestRewarded ( uint32  quest_id) const
inline

◆ isResurrectRequested()

bool Player::isResurrectRequested ( ) const
inline

◆ isResurrectRequestedBy()

bool Player::isResurrectRequestedBy ( ObjectGuid  guid) const
inline
1803{ return m_resurrectGUID && m_resurrectGUID == guid; }

References m_resurrectGUID.

◆ IsSpectator()

◆ IsSpellFitByClassAndRace()

bool Player::IsSpellFitByClassAndRace ( uint32  spell_id) const
12310{
12311 uint32 racemask = getRaceMask();
12312 uint32 classmask = getClassMask();
12313
12314 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
12315 if (bounds.first == bounds.second)
12316 return true;
12317
12318 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
12319 {
12320 // skip wrong race skills
12321 if (_spell_idx->second->RaceMask && (_spell_idx->second->RaceMask & racemask) == 0)
12322 continue;
12323
12324 // skip wrong class skills
12325 if (_spell_idx->second->ClassMask && (_spell_idx->second->ClassMask & classmask) == 0)
12326 continue;
12327
12328 return true;
12329 }
12330
12331 return false;
12332}

References Unit::getClassMask(), Unit::getRaceMask(), and sSpellMgr.

Referenced by GetTrainerSpellState(), learn_commandscript::HandleLearnAllMySpellsCommand(), and WorldSession::SendTrainerList().

◆ IsSummonAsSpectator()

bool Player::IsSummonAsSpectator ( ) const

◆ isTaxiCheater()

bool Player::isTaxiCheater ( ) const
inline

◆ isTotalImmune()

bool Player::isTotalImmune ( ) const
13259{
13261
13262 uint32 immuneMask = 0;
13263 for (AuraEffectList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
13264 {
13265 immuneMask |= (*itr)->GetMiscValue();
13266 if (immuneMask & SPELL_SCHOOL_MASK_ALL) // total immunity
13267 return true;
13268 }
13269 return false;
13270}
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition: SpellAuraDefines.h:102
@ SPELL_SCHOOL_MASK_ALL
Definition: SharedDefines.h:315

References Unit::GetAuraEffectsByType(), SPELL_AURA_SCHOOL_IMMUNITY, and SPELL_SCHOOL_MASK_ALL.

Referenced by CanUseBattlegroundObject(), and IsImmuneToEnvironmentalDamage().

◆ IsTotemCategoryCompatiableWith()

bool Player::IsTotemCategoryCompatiableWith ( ItemTemplate const *  pProto,
uint32  requiredTotemCategoryId 
) const
905{
906 if (requiredTotemCategoryId == 0)
907 return true;
908 if (pProto->TotemCategory == 0)
909 return false;
910
911 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(pProto->TotemCategory);
912 if (!itemEntry)
913 return false;
914 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
915 if (!reqEntry)
916 return false;
917
918 if (itemEntry->categoryType != reqEntry->categoryType)
919 return false;
920
921 if ((itemEntry->categoryMask & reqEntry->categoryMask) != reqEntry->categoryMask)
922 return false;
923
924 // xinef: check skill requirements, needed for enchants!
925 if (pProto->RequiredSkill)
926 if (this->GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
927 return false;
928
929 return true;
930}
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
Definition: DBCStructure.h:1994
uint32 categoryType
Definition: DBCStructure.h:1998
uint32 categoryMask
Definition: DBCStructure.h:1999

References TotemCategoryEntry::categoryMask, TotemCategoryEntry::categoryType, GetSkillValue(), ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, sTotemCategoryStore, and ItemTemplate::TotemCategory.

Referenced by HasItemTotemCategory().

◆ IsTwoHandUsed()

◆ isUsingLfg()

bool Player::isUsingLfg ( )
13016{
13017 return sLFGMgr->GetState(GetGUID()) != lfg::LFG_STATE_NONE;
13018}
@ LFG_STATE_NONE
Definition: LFG.h:71

References Object::GetGUID(), lfg::LFG_STATE_NONE, and sLFGMgr.

Referenced by misc_commandscript::HandleSkirmishCommand(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ IsValidGender()

static bool Player::IsValidGender ( uint8  Gender)
inlinestatic
1560{ return Gender <= GENDER_FEMALE; }
Gender
Definition: SharedDefines.h:60

References GENDER_FEMALE.

Referenced by BuildEnumData(), Create(), ConditionMgr::isConditionTypeValid(), and LoadFromDB().

◆ IsValidPos() [1/2]

bool Player::IsValidPos ( uint16  pos,
bool  explicit_pos 
)
inline
1260{ return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition: Player.h:1260

References IsValidPos().

Referenced by WorldSession::HandleAutoStoreBagItemOpcode(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), and IsValidPos().

◆ IsValidPos() [2/2]

bool Player::IsValidPos ( uint8  bag,
uint8  slot,
bool  explicit_pos 
)
625{
626 // post selected
627 if (bag == NULL_BAG && !explicit_pos)
628 return true;
629
630 if (bag == INVENTORY_SLOT_BAG_0)
631 {
632 // any post selected
633 if (slot == NULL_SLOT && !explicit_pos)
634 return true;
635
636 // equipment
637 if (slot < EQUIPMENT_SLOT_END)
638 return true;
639
640 // bag equip slots
642 return true;
643
644 // backpack slots
646 return true;
647
648 // keyring slots
649 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END)
650 return true;
651
652 // bank main slots
653 if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)
654 return true;
655
656 // bank bag slots
657 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
658 return true;
659
660 return false;
661 }
662
663 // bag content slots
664 // bank bag content slots
665 if (Bag* pBag = GetBagByPos(bag))
666 {
667 // any post selected
668 if (slot == NULL_SLOT && !explicit_pos)
669 return true;
670
671 return slot < pBag->GetBagSize();
672 }
673
674 // where this?
675 return false;
676}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, EQUIPMENT_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_END, KEYRING_SLOT_START, NULL_BAG, and NULL_SLOT.

◆ IsVisibleGloballyFor()

bool Player::IsVisibleGloballyFor ( Player const *  player) const
11439{
11440 if (!u)
11441 return false;
11442
11443 // Always can see self
11444 if (u == this)
11445 return true;
11446
11447 // Visible units, always are visible for all players
11448 if (IsVisible())
11449 return true;
11450
11451 // GMs are visible for higher gms (or players are visible for gms)
11452 if (!AccountMgr::IsPlayerAccount(u->GetSession()->GetSecurity()))
11453 return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity();
11454
11455 if (!sScriptMgr->NotVisibleGloballyFor(const_cast<Player*>(this), u))
11456 return true;
11457
11458 // non faction visibility non-breakable for non-GMs
11459 return false;
11460}
bool IsVisible() const
Definition: Unit.h:1470
AccountTypes GetSecurity() const
Definition: WorldSession.h:359

References WorldSession::GetSecurity(), GetSession(), AccountMgr::IsPlayerAccount(), Unit::IsVisible(), and sScriptMgr.

Referenced by SocialMgr::BroadcastToFriendListers(), SocialMgr::GetFriendInfo(), WorldSession::HandleAddFriendOpcode(), and ChatHandler::needReportToTarget().

◆ ItemAddedQuestCheck()

void Player::ItemAddedQuestCheck ( uint32  entry,
uint32  count 
)
1830{
1831 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1832 {
1833 uint32 questid = GetQuestSlotQuestId(i);
1834 if (questid == 0)
1835 continue;
1836
1837 QuestStatusData& q_status = m_QuestStatus[questid];
1838
1839 if (q_status.Status != QUEST_STATUS_INCOMPLETE)
1840 continue;
1841
1842 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1843 if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1844 continue;
1845
1846 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1847 {
1848 uint32 reqitem = qInfo->RequiredItemId[j];
1849 if (reqitem == entry)
1850 {
1851 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1852 uint16 curitemcount = q_status.ItemCount[j];
1853 if (curitemcount < reqitemcount)
1854 {
1855 q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
1856 m_QuestStatusSave[questid] = true;
1857 }
1858 if (CanCompleteQuest(questid))
1859 CompleteQuest(questid);
1860 else
1862 }
1863 }
1864 }
1866}

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, QuestStatusData::Status, and UpdateForQuestWorldObjects().

Referenced by Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), MoveItemToInventory(), StoreNewItem(), and SwapItem().

◆ ItemRemovedQuestCheck()

void Player::ItemRemovedQuestCheck ( uint32  entry,
uint32  count 
)
1869{
1870 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1871 {
1872 uint32 questid = GetQuestSlotQuestId(i);
1873 if (!questid)
1874 continue;
1875
1876 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1877 if (!qInfo)
1878 continue;
1879
1881 continue;
1882
1883 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1884 {
1885 uint32 reqitem = qInfo->RequiredItemId[j];
1886 if (reqitem == entry)
1887 {
1888 QuestStatusData& q_status = m_QuestStatus[questid];
1889 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1890 uint16 curitemcount = q_status.ItemCount[j];
1891
1892 if (q_status.ItemCount[j] >= reqitemcount) // we may have more than what the status shows
1893 curitemcount = GetItemCount(entry, false);
1894
1895 uint16 newItemCount = (count > curitemcount) ? 0 : curitemcount - count;
1896 newItemCount = std::min<uint16>(newItemCount, reqitemcount);
1897 if (newItemCount != q_status.ItemCount[j])
1898 {
1899 q_status.ItemCount[j] = newItemCount;
1900 m_QuestStatusSave[questid] = true;
1901 IncompleteQuest(questid);
1902 }
1903 }
1904 }
1905 }
1907}
void IncompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:641

References GetItemCount(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), IncompleteQuest(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and UpdateForQuestWorldObjects().

Referenced by DestroyItem(), DestroyItemCount(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ JoinedChannel()

void Player::JoinedChannel ( Channel c)
4936{
4937 m_channels.push_back(c);
4938}

References m_channels.

Referenced by Channel::JoinChannel().

◆ KillCreditGO()

void Player::KillCreditGO ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
2051{
2052 uint16 addCastCount = 1;
2053 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2054 {
2055 uint32 questid = GetQuestSlotQuestId(i);
2056 if (!questid)
2057 continue;
2058
2059 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2060 if (!qInfo)
2061 continue;
2062
2063 QuestStatusData& q_status = m_QuestStatus[questid];
2064
2065 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2066 {
2067 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/)
2068 {
2069 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2070 {
2071 uint32 reqTarget = 0;
2072
2073 // GO activate objective
2074 if (qInfo->RequiredNpcOrGo[j] < 0)
2075 // checked at quest_template loading
2076 reqTarget = - qInfo->RequiredNpcOrGo[j];
2077
2078 // other not this creature/GO related objectives
2079 if (reqTarget != entry)
2080 continue;
2081
2082 uint32 reqCastCount = qInfo->RequiredNpcOrGoCount[j];
2083 uint16 curCastCount = q_status.CreatureOrGOCount[j];
2084 if (curCastCount < reqCastCount)
2085 {
2086 q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
2087
2088 m_QuestStatusSave[questid] = true;
2089
2090 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
2091 }
2092
2093 if (CanCompleteQuest(questid))
2094 CompleteQuest(questid);
2095 else
2097
2098 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2099 break;
2100 }
2101 }
2102 }
2103 }
2104}
void SendQuestUpdateAddCreatureOrGo(Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2450

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::Use().

◆ KilledMonster()

void Player::KilledMonster ( CreatureTemplate const *  cInfo,
ObjectGuid  guid 
)
1910{
1911 ASSERT(cInfo);
1912
1913 if (cInfo->Entry)
1914 KilledMonsterCredit(cInfo->Entry, guid);
1915
1916 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
1917 if (cInfo->KillCredit[i])
1918 KilledMonsterCredit(cInfo->KillCredit[i]);
1919}
#define MAX_KILL_CREDIT
Definition: CreatureData.h:31
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: PlayerQuest.cpp:1921

References ASSERT, CreatureTemplate::Entry, CreatureTemplate::KillCredit, KilledMonsterCredit(), and MAX_KILL_CREDIT.

Referenced by KillRewarder::_RewardKillCredit(), and npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit().

◆ KilledMonsterCredit()

void Player::KilledMonsterCredit ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
1922{
1923 uint16 addkillcount = 1;
1924 uint32 real_entry = entry;
1925 if (guid)
1926 {
1927 Creature* killed = GetMap()->GetCreature(guid);
1928 if (killed && killed->GetEntry())
1929 real_entry = killed->GetEntry();
1930 }
1931
1932 StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
1933 UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : nullptr);
1934
1935 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1936 {
1937 uint32 questid = GetQuestSlotQuestId(i);
1938 if (!questid)
1939 continue;
1940
1941 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1942 if (!qInfo)
1943 continue;
1944 // just if !ingroup || !noraidgroup || raidgroup
1945 // xinef: or is pvp quest, and player in BG/BF group
1946 QuestStatusData& q_status = m_QuestStatus[questid];
1947 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()) ||
1948 (qInfo->IsPVPQuest() && (GetGroup()->isBFGroup() || GetGroup()->isBGGroup()))))
1949 {
1950 if (!sScriptMgr->PassedQuestKilledMonsterCredit(this, qInfo, entry, real_entry, guid))
1951 continue;
1952
1953 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/)
1954 {
1955 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1956 {
1957 // skip GO activate objective or none
1958 if (qInfo->RequiredNpcOrGo[j] <= 0)
1959 continue;
1960
1961 uint32 reqkill = qInfo->RequiredNpcOrGo[j];
1962
1963 if (reqkill == real_entry)
1964 {
1965 uint32 reqkillcount = qInfo->RequiredNpcOrGoCount[j];
1966 uint16 curkillcount = q_status.CreatureOrGOCount[j];
1967 if (curkillcount < reqkillcount)
1968 {
1969 q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
1970
1971 m_QuestStatusSave[questid] = true;
1972
1973 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
1974 }
1975 if (CanCompleteQuest(questid))
1976 CompleteQuest(questid);
1977 else
1979
1980 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
1981 break;
1982 }
1983 }
1984 }
1985 }
1986 }
1987}
@ ACHIEVEMENT_TIMED_TYPE_CREATURE
Definition: DBCEnums.h:114
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition: DBCEnums.h:122
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:213
Creature * GetCreature(ObjectGuid const guid)
Definition: Map.cpp:3314
bool IsPVPQuest() const
Definition: QuestDef.h:294

References ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_TIMED_TYPE_CREATURE, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, Map::GetCreature(), GetDifficulty(), Object::GetEntry(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), Quest::IsPVPQuest(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_KILL, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, sScriptMgr, StartTimedAchievement(), QuestStatusData::Status, and UpdateAchievementCriteria().

Referenced by npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundAB::EventPlayerClickedOnFlag(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), spell_q10714_on_spirits_wings::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q12659_ahunaes_knife::HandleDummy(), spell_q9874_liquid_fire::HandleDummy(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), OutdoorPvPNA::HandleKillImpl(), BattlegroundAV::HandleKillUnit(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q11065_wrangle_some_aether_rays_aura::if(), spell_gen_have_item_auras::if(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), KilledMonster(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_scourge_cage::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_captain_saeed::OnGossipSelect(), RewardPlayerAndGroupAtEvent(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), npc_hallows_end_train_fire::SpellHit(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ KilledPlayerCredit()

void Player::KilledPlayerCredit ( uint16  count = 1)
1990{
1991 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1992 {
1993 uint32 questid = GetQuestSlotQuestId(i);
1994 if (!questid)
1995 {
1996 continue;
1997 }
1998
1999 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2000 if (!qInfo)
2001 {
2002 continue;
2003 }
2004
2005 // just if !ingroup || !noraidgroup || raidgroup
2006 QuestStatusData& q_status = m_QuestStatus[questid];
2007 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty())))
2008 {
2009 // Xinef: PvP Killing quest require player to be in same zone as quest zone (only 2 quests so no doubt, can be extended to conditions in cata ;s)
2010 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && (qInfo->GetZoneOrSort() >= 0 && GetZoneId() == uint32(qInfo->GetZoneOrSort())))
2011 {
2012 KilledPlayerCreditForQuest(count, qInfo);
2013 break; // there is only one quest per zone
2014 }
2015 }
2016 }
2017}
void KilledPlayerCreditForQuest(uint16 count, Quest const *quest)
Definition: PlayerQuest.cpp:2019
int32 GetZoneOrSort() const
Definition: QuestDef.h:229

References GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), KilledPlayerCreditForQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by KillRewarder::_RewardPlayer().

◆ KilledPlayerCreditForQuest()

void Player::KilledPlayerCreditForQuest ( uint16  count,
Quest const *  quest 
)
2020{
2021 uint32 const questId = quest->GetQuestId();
2022
2023 auto it = m_QuestStatus.find(questId);
2024 if (it == m_QuestStatus.end())
2025 {
2026 return;
2027 }
2028
2029 QuestStatusData& questStatus = it->second;
2030
2031 uint16 curKill = questStatus.PlayerCount;
2032 uint32 reqKill = quest->GetPlayersSlain();
2033
2034 if (curKill < reqKill)
2035 {
2036 count = std::min<uint16>(reqKill - curKill, count);
2037 questStatus.PlayerCount = curKill + count;
2038
2039 m_QuestStatusSave[quest->GetQuestId()] = true;
2040
2041 SendQuestUpdateAddPlayer(quest, curKill, count);
2042 }
2043
2044 if (CanCompleteQuest(questId))
2045 {
2046 CompleteQuest(questId);
2047 }
2048}
void SendQuestUpdateAddPlayer(Quest const *quest, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2473

References CanCompleteQuest(), CompleteQuest(), Quest::GetPlayersSlain(), Quest::GetQuestId(), m_QuestStatus, m_QuestStatusSave, QuestStatusData::PlayerCount, and SendQuestUpdateAddPlayer().

Referenced by KilledPlayerCredit().

◆ KillPlayer()

void Player::KillPlayer ( )
4493{
4494 if (IsFlying() && !GetTransport())
4496
4498
4499 StopMirrorTimers(); //disable timers(bars)
4500
4501 setDeathState(DeathState::Corpse);
4502 //SetUnitFlag(UNIT_FLAG_NOT_IN_PVP);
4503
4506
4507 // 6 minutes until repop at graveyard
4509
4510 UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
4511
4512 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4513
4514 if (corpseReclaimDelay >= 0)
4515 SendCorpseReclaimDelay(corpseReclaimDelay);
4516
4517 sScriptMgr->OnPlayerJustDied(this);
4518 // don't create corpse at this moment, player might be falling
4519
4520 // update visibility
4521 //UpdateObjectVisibility(); // pussywizard: not needed
4522}
@ SPELL_AURA_PREVENT_RESURRECTION
Definition: SpellAuraDefines.h:377
@ PLAYER_FIELD_BYTE_RELEASE_TIMER
Definition: Player.h:560
@ MOVE_ROOT
Definition: Player.h:456
@ UNIT_DYNFLAG_NONE
Definition: SharedDefines.h:3120
void ApplyModFlag(uint16 index, uint32 flag, bool apply)
Definition: Object.cpp:899
void UpdateCorpseReclaimDelay()
Definition: PlayerUpdates.cpp:1879
void setDeathState(DeathState s, bool despawn=false) override
Definition: Player.cpp:1013
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:666
MotionMaster * GetMotionMaster()
Definition: Unit.h:1605
bool IsFlying() const
Definition: Unit.h:1728
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:624

References Object::ApplyModFlag(), CalculateCorpseReclaimDelay(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetTransport(), Unit::HasAuraType(), IN_MILLISECONDS, Unit::IsFlying(), m_deathTimer, MINUTE, MOVE_ROOT, MotionMaster::MoveFall(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, Unit::ReplaceAllDynamicFlags(), SendCorpseReclaimDelay(), setDeathState(), SetMovement(), sMapStore, SPELL_AURA_PREVENT_RESURRECTION, sScriptMgr, StopMirrorTimers(), UNIT_DYNFLAG_NONE, and UpdateCorpseReclaimDelay().

Referenced by WorldSession::HandleMovementOpcodes(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), and Update().

◆ LearnCustomSpells()

void Player::LearnCustomSpells ( )
11790{
11791 if (!sWorld->getBoolConfig(CONFIG_START_CUSTOM_SPELLS))
11792 {
11793 return;
11794 }
11795
11796 // learn default race/class spells
11797 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11798 ASSERT(info);
11799 for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
11800 {
11801 uint32 tspell = *itr;
11802 LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '{}' ({}, Class: {} Race: {}): Adding initial spell (SpellID: {})",
11803 GetName(), GetGUID().ToString(), uint32(getClass()), uint32(getRace()), tspell);
11804 if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
11805 {
11806 addSpell(tspell, SPEC_MASK_ALL, true);
11807 }
11808 else // but send in normal spell in game learn case
11809 {
11810 learnSpell(tspell);
11811 }
11812 }
11813}
@ CONFIG_START_CUSTOM_SPELLS
Definition: IWorld.h:130
PlayerCreateInfoSpells customSpells
Definition: Player.h:348

References addSpell(), ASSERT, CONFIG_START_CUSTOM_SPELLS, PlayerInfo::customSpells, Unit::getClass(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, sObjectMgr, SPEC_MASK_ALL, sWorld, and Position::ToString().

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnDefaultSkill()

void Player::LearnDefaultSkill ( uint32  skillId,
uint16  rank 
)
11830{
11831 SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass());
11832 if (!rcInfo)
11833 return;
11834
11835 LOG_DEBUG("entities.player.loading", "PLAYER (Class: {} Race: {}): Adding initial skill, id = {}", uint32(getClass()), uint32(getRace()), skillId);
11836 switch (GetSkillRangeType(rcInfo))
11837 {
11839 SetSkill(skillId, 0, 300, 300);
11840 break;
11841 case SKILL_RANGE_LEVEL:
11842 {
11843 uint16 skillValue = 1;
11844 uint16 maxValue = GetMaxSkillValueForLevel();
11845 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL) && !IsProfessionOrRidingSkill(skillId))
11846 {
11847 skillValue = maxValue;
11848 }
11849 else if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11850 {
11851 skillValue = maxValue;
11852 }
11854 {
11855 skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
11856 }
11857 else if (skillId == SKILL_FIST_WEAPONS)
11858 {
11859 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
11860 }
11861 else if (skillId == SKILL_LOCKPICKING)
11862 {
11863 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
11864 }
11865
11866 SetSkill(skillId, 0, skillValue, maxValue);
11867 break;
11868 }
11869 case SKILL_RANGE_MONO:
11870 SetSkill(skillId, 0, 1, 1);
11871 break;
11872 case SKILL_RANGE_RANK:
11873 {
11874 if (!rank)
11875 {
11876 break;
11877 }
11878
11879 SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID);
11880 uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
11881 uint16 skillValue = 1;
11882 if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11883 {
11884 skillValue = maxValue;
11885 }
11887 {
11888 skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
11889 }
11890
11891 SetSkill(skillId, rank, skillValue, maxValue);
11892 break;
11893 }
11894 default:
11895 break;
11896 }
11897}
bool IsProfessionOrRidingSkill(uint32 skill)
Definition: SpellMgr.h:623
@ SKILL_RANGE_RANK
Definition: ObjectMgr.h:677
@ CLASS_CONTEXT_SKILL
Definition: UnitDefines.h:211
@ SKILL_FLAG_ALWAYS_MAX_VALUE
Definition: DBCEnums.h:386
uint32 SkillTierID
Definition: DBCStructure.h:1576
uint32 Flags
Definition: DBCStructure.h:1574
uint32 Value[MAX_SKILL_STEP]
Definition: DBCStructure.h:1618

References CLASS_CONTEXT_SKILL, CLASS_DEATH_KNIGHT, CONFIG_ALWAYS_MAXSKILL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), Unit::GetLevel(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), GetSkillValue(), IsClass(), IsProfessionOrRidingSkill(), LOG_DEBUG, SetSkill(), SKILL_FIST_WEAPONS, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_LOCKPICKING, SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_RANGE_RANK, SKILL_UNARMED, SkillRaceClassInfoEntry::SkillTierID, sSkillTiersStore, sWorld, and SkillTiersEntry::Value.

Referenced by _addSpell(), and LearnDefaultSkills().

◆ LearnDefaultSkills()

void Player::LearnDefaultSkills ( )
11816{
11817 // learn default race/class skills
11818 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11819 for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr)
11820 {
11821 uint32 skillId = itr->SkillId;
11822 if (HasSkill(skillId))
11823 continue;
11824
11825 LearnDefaultSkill(skillId, itr->Rank);
11826 }
11827}
PlayerCreateInfoSkills skills
Definition: Player.h:351

References Unit::getClass(), Unit::getRace(), HasSkill(), LearnDefaultSkill(), PlayerInfo::skills, and sObjectMgr.

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnPetTalent()

void Player::LearnPetTalent ( ObjectGuid  petGuid,
uint32  talentId,
uint32  talentRank 
)
14025{
14026 Pet* pet = GetPet();
14027
14028 if (!pet)
14029 return;
14030
14031 if (petGuid != pet->GetGUID())
14032 return;
14033
14034 uint32 CurTalentPoints = pet->GetFreeTalentPoints();
14035
14036 if (CurTalentPoints == 0)
14037 return;
14038
14039 if (talentRank >= MAX_PET_TALENT_RANK)
14040 return;
14041
14042 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14043
14044 if (!talentInfo)
14045 return;
14046
14047 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14048
14049 if (!talentTabInfo)
14050 return;
14051
14052 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14053
14054 if (!ci)
14055 return;
14056
14057 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14058
14059 if (!pet_family)
14060 return;
14061
14062 if (pet_family->petTalentType < 0) // not hunter pet
14063 return;
14064
14065 // prevent learn talent for different family (cheating)
14066 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14067 return;
14068
14069 // find current max talent rank (0~5)
14070 uint8 curtalent_maxrank = 0; // 0 = not learned any rank
14071 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14072 {
14073 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14074 {
14075 curtalent_maxrank = (rank + 1);
14076 break;
14077 }
14078 }
14079
14080 // we already have same or higher talent rank learned
14081 if (curtalent_maxrank >= (talentRank + 1))
14082 return;
14083
14084 // check if we have enough talent points
14085 if (CurTalentPoints < (talentRank - curtalent_maxrank + 1))
14086 return;
14087
14088 // Check if it requires another talent
14089 if (talentInfo->DependsOn > 0)
14090 {
14091 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14092 {
14093 bool hasEnoughRank = false;
14094 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14095 {
14096 if (depTalentInfo->RankID[rank] != 0)
14097 if (pet->HasSpell(depTalentInfo->RankID[rank]))
14098 hasEnoughRank = true;
14099 }
14100 if (!hasEnoughRank)
14101 return;
14102 }
14103 }
14104
14105 // Find out how many points we have in this field
14106 uint32 spentPoints = 0;
14107
14108 uint32 tTab = talentInfo->TalentTab;
14109 if (talentInfo->Row > 0)
14110 {
14111 uint32 numRows = sTalentStore.GetNumRows();
14112 for (uint32 i = 0; i < numRows; ++i) // Loop through all talents.
14113 {
14114 // Someday, someone needs to revamp
14115 const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i);
14116 if (tmpTalent) // the way talents are tracked
14117 {
14118 if (tmpTalent->TalentTab == tTab)
14119 {
14120 for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++)
14121 {
14122 if (tmpTalent->RankID[rank] != 0)
14123 {
14124 if (pet->HasSpell(tmpTalent->RankID[rank]))
14125 {
14126 spentPoints += (rank + 1);
14127 }
14128 }
14129 }
14130 }
14131 }
14132 }
14133 }
14134
14135 // not have required min points spent in talent tree
14136 if (spentPoints < (talentInfo->Row * MAX_PET_TALENT_RANK))
14137 return;
14138
14139 // spell not set in talent.dbc
14140 uint32 spellid = talentInfo->RankID[talentRank];
14141 if (spellid == 0)
14142 {
14143 LOG_ERROR("entities.player", "Talent.dbc have for talent: {} Rank: {} spell id = 0", talentId, talentRank);
14144 return;
14145 }
14146
14147 // already known
14148 if (pet->HasSpell(spellid))
14149 return;
14150
14151 // learn! (other talent ranks will unlearned at learning)
14152 pet->learnSpell(spellid);
14153 LOG_DEBUG("entities.player", "PetTalentID: {} Rank: {} Spell: {}\n", talentId, talentRank, spellid);
14154
14155 // update free talent points
14156 pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
14157}
#define MAX_PET_TALENT_RANK
Definition: DBCStructure.h:1919
void SetFreeTalentPoints(uint8 points)
Definition: Pet.h:132
bool learnSpell(uint32 spell_id)
Definition: Pet.cpp:1912
uint32 Row
Definition: DBCStructure.h:1926
uint32 DependsOnRank
Definition: DBCStructure.h:1932
uint32 DependsOn
Definition: DBCStructure.h:1930

References TalentEntry::DependsOn, TalentEntry::DependsOnRank, CreatureTemplate::family, Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), Object::GetGUID(), GetPet(), Pet::HasSpell(), Pet::learnSpell(), LOG_DEBUG, LOG_ERROR, MAX_PET_TALENT_RANK, MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, TalentEntry::RankID, TalentEntry::Row, sCreatureFamilyStore, Pet::SetFreeTalentPoints(), sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by WorldSession::HandleLearnPreviewTalentsPet(), and WorldSession::HandlePetLearnTalent().

◆ learnQuestRewardedSpells() [1/2]

void Player::learnQuestRewardedSpells ( )
11932{
11933 // learn spells received from quest completing
11934 for (RewardedQuestSet::const_iterator itr = m_RewardedQuests.begin(); itr != m_RewardedQuests.end(); ++itr)
11935 {
11936 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
11937 if (!quest)
11938 continue;
11939
11941 }
11942}

References learnQuestRewardedSpells(), m_RewardedQuests, and sObjectMgr.

Referenced by _LoadQuestStatusRewarded(), learn_commandscript::HandleLearnAllDefaultCommand(), learnQuestRewardedSpells(), and resetSpells().

◆ learnQuestRewardedSpells() [2/2]

void Player::learnQuestRewardedSpells ( Quest const *  quest)
11900{
11901 // xinef: quest does not learn anything
11902 int32 spellId = quest->GetRewSpellCast();
11903 if (!spellId)
11904 return;
11905
11906 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
11907 if (!spellInfo)
11908 return;
11909
11910 // xinef: find effect with learn spell and check if we have this spell
11911 bool found = false;
11912 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
11913 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell && !HasSpell(spellInfo->Effects[i].TriggerSpell))
11914 {
11915 // pusywizard: don't re-add profession specialties!
11916 if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
11917 if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
11918 break; // pussywizard: break and not cast the spell (found is false)
11919
11920 found = true;
11921 break;
11922 }
11923
11924 // xinef: we know the spell, return
11925 if (!found)
11926 return;
11927
11928 CastSpell(this, spellId, true);
11929}
@ SPELL_EFFECT_TRADE_SKILL
Definition: SharedDefines.h:825

References Unit::CastSpell(), SpellInfo::Effects, Quest::GetRewSpellCast(), HasSpell(), MAX_SPELL_EFFECTS, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_TRADE_SKILL, and sSpellMgr.

◆ learnSkillRewardedSpells()

void Player::learnSkillRewardedSpells ( uint32  id,
uint32  value 
)
11945{
11946 uint32 raceMask = getRaceMask();
11947 uint32 classMask = getClassMask();
11948 for (SkillLineAbilityEntry const* pAbility : GetSkillLineAbilitiesBySkillLine(skill_id))
11949 {
11950 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->Spell);
11951 if (!spellInfo)
11952 {
11953 continue;
11954 }
11955
11956 if (pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
11957 {
11958 continue;
11959 }
11960
11961 // Check race if set
11962 if (pAbility->RaceMask && !(pAbility->RaceMask & raceMask))
11963 {
11964 continue;
11965 }
11966
11967 // Check class if set
11968 if (pAbility->ClassMask && !(pAbility->ClassMask & classMask))
11969 {
11970 continue;
11971 }
11972
11973 // need unlearn spell
11974 if (skill_value < pAbility->MinSkillLineRank && pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
11975 {
11976 removeSpell(pAbility->Spell, GetActiveSpec(), true);
11977 }
11978 // need learn
11979 else
11980 {
11981 //used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn
11982 if (pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && pAbility->SupercededBySpell)
11983 {
11984 bool skipCurrent = false;
11985 auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(pAbility->SupercededBySpell);
11986 for (auto itr = bounds.first; itr != bounds.second; ++itr)
11987 {
11988 if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skill_value >= itr->second->MinSkillLineRank)
11989 {
11990 skipCurrent = true;
11991 break;
11992 }
11993 }
11994 if (skipCurrent)
11995 {
11996 continue;
11997 }
11998 }
11999
12000 if (!IsInWorld())
12001 {
12002 addSpell(pAbility->Spell, SPEC_MASK_ALL, true, true);
12003 }
12004 else
12005 {
12006 learnSpell(pAbility->Spell, true, true);
12007 }
12008 }
12009 }
12010}
const std::vector< SkillLineAbilityEntry const * > & GetSkillLineAbilitiesBySkillLine(uint32 skillLine)
Definition: DBCStores.cpp:916
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE
Definition: DBCEnums.h:360
Definition: DBCStructure.h:1598

References addSpell(), GetActiveSpec(), Unit::getClassMask(), Unit::getRaceMask(), GetSkillLineAbilitiesBySkillLine(), Object::IsInWorld(), learnSpell(), removeSpell(), SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE, SPEC_MASK_ALL, and sSpellMgr.

Referenced by _LoadSkills(), SetSkill(), and UpdateSkillPro().

◆ learnSpell()

void Player::learnSpell ( uint32  spellId,
bool  temporary = false,
bool  learnFromSkill = false 
)
3271{
3272 // Xinef: don't allow to learn active spell once more
3273 if (HasActiveSpell(spellId))
3274 {
3275 LOG_DEBUG("entities.player", "Player ({}) tries to learn already active spell: {}", GetGUID().ToString(), spellId);
3276 return;
3277 }
3278
3279 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId);
3280 bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId);
3281 bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill);
3282 if (added)
3283 {
3284 sScriptMgr->OnPlayerLearnSpell(this, spellId);
3285
3286 // pussywizard: a system message "you have learnt spell X (rank Y)"
3287 if (IsInWorld())
3288 SendLearnPacket(spellId, true);
3289 }
3290
3291 // pussywizard: rank stuff at the end!
3292 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spellId))
3293 {
3294 // pussywizard: lookup next rank in m_spells (the only talents on m_spella are for example pyroblast, that have all ranks restored upon learning rank 1)
3295 // pussywizard: next ranks must not be in current spec (otherwise no need to learn already learnt)
3296 PlayerSpellMap::iterator itr = m_spells.find(nextSpell);
3297 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && !itr->second->IsInSpec(m_activeSpec))
3298 learnSpell(nextSpell, temporary);
3299 }
3300
3301 // xinef: if we learn new spell, check all spells requiring this spell, if we have such a spell, and it is not in current spec - learn it
3302 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(spellId);
3303 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequiringSpell.first; itr != spellsRequiringSpell.second; ++itr)
3304 {
3305 PlayerSpellMap::iterator itr2 = m_spells.find(itr->second);
3306 if (itr2 != m_spells.end() && itr2->second->State != PLAYERSPELL_REMOVED && !itr2->second->IsInSpec(m_activeSpec))
3307 learnSpell(itr2->first, temporary);
3308 }
3309}
uint32 GetTalentSpellCost(uint32 spellId)
Definition: DBCStores.cpp:686

References addSpell(), GetActiveSpecMask(), Object::GetGUID(), GetTalentSpellCost(), HasActiveSpell(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, m_activeSpec, m_spells, PLAYERSPELL_REMOVED, SendLearnPacket(), SPEC_MASK_ALL, sScriptMgr, sSpellMgr, and Position::ToString().

Referenced by _addSpell(), Spell::EffectLearnSpell(), learn_commandscript::HandleLearnAllGMCommand(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllMySpellsCommand(), learn_commandscript::HandleLearnSkillRecipesHelper(), Acore::PlayerCommand::HandleLearnSpellCommand(), spell_gen_profession_research::HandleScript(), spell_item_book_of_glyph_mastery::HandleScript(), WorldSession::HandleTrainerBuySpellOpcode(), LearnCustomSpells(), learnSkillRewardedSpells(), learnSpell(), learnSpellHighRank(), LearnTalent(), and UpdateCraftSkill().

◆ learnSpellHighRank()

void Player::learnSpellHighRank ( uint32  spellid)
13612{
13613 learnSpell(spellid);
13614
13615 if (uint32 next = sSpellMgr->GetNextSpellInChain(spellid))
13616 learnSpellHighRank(next);
13617}
void learnSpellHighRank(uint32 spellid)
Definition: Player.cpp:13611

References learnSpell(), learnSpellHighRank(), and sSpellMgr.

Referenced by learnSpellHighRank().

◆ LearnTalent()

void Player::LearnTalent ( uint32  talentId,
uint32  talentRank,
bool  command = false 
)
13889{
13890 uint32 CurTalentPoints = GetFreeTalentPoints();
13891
13892 if (!command)
13893 {
13894 // xinef: check basic data
13895 if (!CurTalentPoints)
13896 {
13897 return;
13898 }
13899
13900 if (talentRank >= MAX_TALENT_RANK)
13901 {
13902 return;
13903 }
13904 }
13905
13906 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
13907 if (!talentInfo)
13908 return;
13909
13910 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
13911 if (!talentTabInfo)
13912 return;
13913
13914 // xinef: prevent learn talent for different class (cheating)
13915 if ((getClassMask() & talentTabInfo->ClassMask) == 0)
13916 return;
13917
13918 // xinef: find current talent rank
13919 uint32 currentTalentRank = 0;
13920 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
13921 {
13922 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], GetActiveSpec()))
13923 {
13924 currentTalentRank = rank + 1;
13925 break;
13926 }
13927 }
13928
13929 // xinef: we already have same or higher rank talent learned
13930 if (currentTalentRank >= talentRank + 1)
13931 return;
13932
13933 uint32 talentPointsChange = (talentRank - currentTalentRank + 1);
13934 if (!command)
13935 {
13936 // xinef: check if we have enough free talent points
13937 if (CurTalentPoints < talentPointsChange)
13938 {
13939 return;
13940 }
13941 }
13942
13943 // xinef: check if talent deponds on another talent
13944 if (talentInfo->DependsOn > 0)
13945 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
13946 {
13947 bool hasEnoughRank = false;
13948 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
13949 {
13950 if (depTalentInfo->RankID[rank] != 0)
13951 if (HasTalent(depTalentInfo->RankID[rank], GetActiveSpec()))
13952 {
13953 hasEnoughRank = true;
13954 break;
13955 }
13956 }
13957
13958 // xinef: does not have enough talent points spend in required talent
13959 if (!hasEnoughRank)
13960 return;
13961 }
13962
13963 if (!command)
13964 {
13965 // xinef: check amount of points spent in current talent tree
13966 // xinef: be smart and quick
13967 uint32 spentPoints = 0;
13968 if (talentInfo->Row > 0)
13969 {
13970 const PlayerTalentMap& talentMap = GetTalentMap();
13971 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
13972 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
13973 if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id))
13974 if (itrTalentInfo->TalentTab == talentInfo->TalentTab)
13975 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) // pussywizard
13976 spentPoints += talentPos->rank + 1;
13977 }
13978
13979 // xinef: we do not have enough talent points to add talent of this tier
13980 if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK))
13981 return;
13982 }
13983
13984 // xinef: hacking attempt, tries to learn unknown rank
13985 uint32 spellId = talentInfo->RankID[talentRank];
13986 if (spellId == 0)
13987 return;
13988
13989 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
13990 if (!spellInfo)
13991 return;
13992
13993 bool learned = false;
13994
13995 // xinef: if talent info has special marker in dbc - add to spell book
13996 if (talentInfo->addToSpellBook)
13997 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
13998 {
13999 learnSpell(spellId);
14000 learned = true;
14001 }
14002
14003 if (!learned)
14004 SendLearnPacket(spellId, true);
14005
14006 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
14007 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
14008 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
14009 learnSpell(spellInfo->Effects[i].TriggerSpell);
14010
14011 addTalent(spellId, GetActiveSpecMask(), currentTalentRank);
14012
14013 // xinef: update free talent points count
14014 m_usedTalentCount += talentPointsChange;
14015
14016 if (!command)
14017 {
14018 SetFreeTalentPoints(CurTalentPoints - talentPointsChange);
14019 }
14020
14021 sScriptMgr->OnPlayerLearnTalents(this, talentId, talentRank, spellId);
14022}
uint32 ClassMask
Definition: DBCStructure.h:1946

References addTalent(), TalentEntry::addToSpellBook, TalentTabEntry::ClassMask, TalentEntry::DependsOn, TalentEntry::DependsOnRank, SpellInfo::Effects, GetActiveSpec(), GetActiveSpecMask(), Unit::getClassMask(), GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasTalent(), learnSpell(), m_usedTalentCount, MAX_SPELL_EFFECTS, MAX_TALENT_RANK, PLAYERSPELL_REMOVED, TalentEntry::RankID, TalentEntry::Row, SendLearnPacket(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by learn_commandscript::HandleLearnAllMyTalentsCommand(), WorldSession::HandleLearnPreviewTalents(), and WorldSession::HandleLearnTalentOpcode().

◆ LeaveAllArenaTeams()

void Player::LeaveAllArenaTeams ( ObjectGuid  guid)
static
10133{
10134 // xinef: sync query
10136 stmt->SetData(0, guid.GetCounter());
10137 PreparedQueryResult result = CharacterDatabase.Query(stmt);
10138
10139 if (!result)
10140 return;
10141
10142 do
10143 {
10144 Field* fields = result->Fetch();
10145 uint32 arenaTeamId = fields[0].Get<uint32>();
10146 if (arenaTeamId != 0)
10147 {
10148 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
10149 if (arenaTeam)
10150 arenaTeam->DelMember(guid, true);
10151 }
10152 } while (result->NextRow());
10153}
@ CHAR_SEL_PLAYER_ARENA_TEAMS
Definition: CharacterDatabase.h:231
void DelMember(ObjectGuid guid, bool cleanDb)
Definition: ArenaTeam.cpp:324

References CHAR_SEL_PLAYER_ARENA_TEAMS, CharacterDatabase, ArenaTeam::DelMember(), Field::Get(), ObjectGuid::GetCounter(), sArenaTeamMgr, and PreparedStatementBase::SetData().

Referenced by DeleteFromDB(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ LeaveBattleground()

void Player::LeaveBattleground ( Battleground bg = nullptr)
11275{
11276 if (!bg)
11277 bg = GetBattleground();
11278
11279 if (!bg)
11280 return;
11281
11282 // Deserter tracker - leave BG
11283 if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11284 {
11285 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
11286 {
11288 stmt->SetData(0, GetGUID().GetCounter());
11290 CharacterDatabase.Execute(stmt);
11291 }
11292 sScriptMgr->OnBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG);
11293 }
11294
11295 bg->RemovePlayerAtLeave(this);
11296
11297 // xinef: reset corpse reclaim time
11299
11300 // Remove all dots
11304
11305 // pussywizard: clear movement, because after porting player will move to arena cords
11307 StopMoving();
11309}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ BG_DESERTION_TYPE_LEAVE_BG
Definition: Battleground.h:50
@ STATUS_WAIT_JOIN
Definition: Battleground.h:196
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
Definition: IWorld.h:121
@ CHAR_INS_DESERTER_TRACK
Definition: CharacterDatabase.h:496
virtual void RemovePlayerAtLeave(Player *player)
Definition: Battleground.cpp:968
bool isBattleground() const
Definition: Battleground.h:397
BattlegroundStatus GetStatus() const
Definition: Battleground.h:327
bool TeleportToEntryPoint()
Definition: Player.cpp:1596
void StopMoving()
Definition: Unit.cpp:16578
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:178

References BG_DESERTION_TYPE_LEAVE_BG, CHAR_INS_DESERTER_TRACK, CharacterDatabase, CONFIG_BATTLEGROUND_TRACK_DESERTERS, GetBattleground(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetMotionMaster(), Battleground::GetStatus(), Battleground::isBattleground(), m_deathExpireTime, MotionMaster::MovementExpired(), Unit::RemoveAurasByType(), Battleground::RemovePlayerAtLeave(), PreparedStatementBase::SetData(), SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_LEECH, sScriptMgr, STATUS_IN_PROGRESS, STATUS_WAIT_JOIN, Unit::StopMoving(), sWorld, and TeleportToEntryPoint().

Referenced by BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::LogoutPlayer(), and ToggleAFK().

◆ LeftChannel()

void Player::LeftChannel ( Channel c)
4941{
4942 m_channels.remove(c);
4943}

References m_channels.

Referenced by Channel::KickOrBan(), Channel::LeaveChannel(), and UpdateLocalChannels().

◆ LoadActions()

void Player::LoadActions ( PreparedQueryResult  result)
15224{
15225 if (result)
15226 _LoadActions(result);
15227
15229}
void _LoadActions(PreparedQueryResult result)
Definition: PlayerStorage.cpp:5688

References _LoadActions(), and SendActionButtons().

◆ LoadCorpse()

void Player::LoadCorpse ( PreparedQueryResult  result)
5830{
5832 SpawnCorpseBones(false);
5833
5834 if (!IsAlive())
5835 {
5836 if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
5837 {
5838 Field* fields = result->Fetch();
5839 _corpseLocation.WorldRelocate(fields[0].Get<uint16>(), fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
5841 }
5842 else
5843 ResurrectPlayer(0.5f);
5844 }
5845
5847}
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
Definition: Player.cpp:14584
bool HasAtLoginFlag(AtLoginFlags f) const
Definition: Player.h:2378
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition: Player.cpp:4415

References _corpseLocation, Object::ApplyModFlag(), AT_LOGIN_RESURRECT, WorldLocation::GetMapId(), HasAtLoginFlag(), Unit::IsAlive(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, RemoveAtLoginFlag(), ResurrectPlayer(), sMapStore, SpawnCorpseBones(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadFromDB()

bool Player::LoadFromDB ( ObjectGuid  guid,
CharacterDatabaseQueryHolder const &  holder 
)
4934{
4936 //QueryResult* result = CharacterDatabase.Query("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
4937 // 17 18 19 20 21 22 23 24 25 26 27 28 29
4938 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
4939 // 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4940 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
4941 // 44 45 46 47 48 49 50 51 52 53 54
4942 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
4943 // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
4944 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles,
4945 // 70 71 72 73 74
4946 //"actionBars, grantableLevels, innTriggerId, extraBonusTalentCount, UNIX_TIMESTAMP(creation_date) FROM characters WHERE guid = '{}'", guid);
4947 PreparedQueryResult result = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
4948
4949 if (!result)
4950 {
4951 LOG_ERROR("entities.player", "Player ({}) not found in table `characters`, can't load. ", playerGuid.ToString());
4952 return false;
4953 }
4954
4955 Field* fields = result->Fetch();
4956
4957 uint32 dbAccountId = fields[1].Get<uint32>();
4958
4959 // check if the character's account in the db and the logged in account match.
4960 // player should be able to load/delete character only with correct account!
4961 if (dbAccountId != GetSession()->GetAccountId())
4962 {
4963 LOG_ERROR("entities.player", "Player ({}) loading from wrong account (is: {}, should be: {})", playerGuid.ToString(), GetSession()->GetAccountId(), dbAccountId);
4964 return false;
4965 }
4966
4967 if (holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED))
4968 {
4969 LOG_ERROR("entities.player", "Player ({}) is banned, can't load.", playerGuid.ToString());
4970 return false;
4971 }
4972
4973 ObjectGuid::LowType guid = playerGuid.GetCounter();
4974
4975 Object::_Create(guid, 0, HighGuid::Player);
4976
4977 m_name = fields[2].Get<std::string>();
4978
4979 // check name limitations
4981 {
4983 stmt->SetData(0, uint16(AT_LOGIN_RENAME));
4984 stmt->SetData(1, guid);
4985 CharacterDatabase.Execute(stmt);
4986 return false;
4987 }
4988
4989 uint8 Gender = fields[5].Get<uint8>();
4990 if (!IsValidGender(Gender))
4991 {
4992 LOG_ERROR("entities.player", "Player (GUID: {}) has wrong gender ({}), can't be loaded.", guid, Gender);
4993 return false;
4994 }
4995
4996 // overwrite some data fields
4997 uint32 bytes0 = 0;
4998 bytes0 |= fields[3].Get<uint8>(); // race
4999 bytes0 |= fields[4].Get<uint8>() << 8; // class
5000 bytes0 |= Gender << 16; // gender
5002
5003 m_realRace = fields[3].Get<uint8>(); // set real race
5004 m_race = fields[3].Get<uint8>(); // set real race
5005
5006 SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].Get<uint8>());
5007 SetUInt32Value(PLAYER_XP, fields[7].Get<uint32>());
5008
5009 if (!_LoadIntoDataField(fields[66].Get<std::string>(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE))
5010 {
5011 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid exploredzones data ({}). Forcing partial load.", guid, fields[66].Get<std::string_view>());
5012 }
5013
5014 if (!_LoadIntoDataField(fields[69].Get<std::string>(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2))
5015 {
5016 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid knowntitles mask ({}). Forcing partial load.", guid, fields[69].Get<std::string_view>());
5017 }
5018
5019 SetObjectScale(1.0f);
5021
5022 // load character creation date, relevant for achievements of type average
5023 SetCreationTime(fields[74].Get<Seconds>());
5024
5025 // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
5027
5028 uint32 money = fields[8].Get<uint32>();
5029 if (money > MAX_MONEY_AMOUNT)
5030 money = MAX_MONEY_AMOUNT;
5031 SetMoney(money);
5032
5033 SetByteValue(PLAYER_BYTES, 0, fields[9].Get<uint8>());
5034 SetByteValue(PLAYER_BYTES, 1, fields[10].Get<uint8>());
5035 SetByteValue(PLAYER_BYTES, 2, fields[11].Get<uint8>());
5036 SetByteValue(PLAYER_BYTES, 3, fields[12].Get<uint8>());
5037 SetByteValue(PLAYER_BYTES_2, 0, fields[13].Get<uint8>());
5038 SetByteValue(PLAYER_BYTES_2, 2, fields[14].Get<uint8>());
5039 SetByteValue(PLAYER_BYTES_2, 3, fields[15].Get<uint8>());
5040 SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get<uint8>());
5041 SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get<uint8>());
5042 ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get<uint32>());
5043 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get<uint32>());
5044
5045 SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get<uint64>());
5046
5047 SetUInt32Value(PLAYER_AMMO_ID, fields[68].Get<uint32>());
5048
5049 // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
5050 SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].Get<uint8>());
5051
5053
5054 // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory)
5055 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
5056 {
5058 SetVisibleItemSlot(slot, nullptr);
5059
5060 delete m_items[slot];
5061 m_items[slot] = nullptr;
5062 }
5063
5064 LOG_DEBUG("entities.player.loading", "Load Basic value of player {} is: ", m_name);
5066
5067 //Need to call it to initialize m_team (m_team can be calculated from race)
5068 //Other way is to saves m_team into characters table.
5070
5071 // pussywizard: create empty instance bind containers if necessary
5072 sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid);
5073
5074 // load home bind and check in same time class/race pair, it used later for restore broken positions
5075 if (!_LoadHomeBind(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
5076 return false;
5077
5078 InitPrimaryProfessions(); // to max set before any spell loaded
5079
5080 // init saved position, and fix it later if problematic
5081 int32 transLowGUID = fields[35].Get<int32>();
5082 Relocate(fields[17].Get<float>(), fields[18].Get<float>(), fields[19].Get<float>(), fields[21].Get<float>());
5083 uint32 mapId = fields[20].Get<uint16>();
5084 uint32 instanceId = fields[63].Get<uint32>();
5085
5086 uint32 dungeonDiff = fields[43].Get<uint8>() & 0x0F;
5087 if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY)
5088 dungeonDiff = DUNGEON_DIFFICULTY_NORMAL;
5089 uint32 raidDiff = (fields[43].Get<uint8>() >> 4) & 0x0F;
5090 if (raidDiff >= MAX_RAID_DIFFICULTY)
5092 SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup
5093 SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup
5094
5095 std::string taxi_nodes = fields[42].Get<std::string>();
5096
5097 auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); };
5098
5099 _LoadGroup();
5100
5102
5103 SetArenaPoints(fields[44].Get<uint32>());
5104
5105 SetHonorPoints(fields[45].Get<uint32>());
5106 SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].Get<uint32>());
5107 SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].Get<uint32>());
5108 SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].Get<uint32>());
5109 SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].Get<uint16>());
5110 SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].Get<uint16>());
5111
5114
5115 GetSession()->SetPlayer(this);
5116 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
5117
5118 Map* map = nullptr;
5119
5120 // pussywizard: group changed difficulty when player was offline, teleport to the enterance of new difficulty
5121 if (mapEntry && ((mapEntry->IsNonRaidDungeon() && dungeonDiff != GetDungeonDifficulty()) || (mapEntry->IsRaid() && raidDiff != GetRaidDifficulty())))
5122 {
5123 bool fixed = false;
5124 if (uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(this, mapId, GetDifficulty(mapEntry->IsRaid())))
5125 {
5126 instanceId = destInstId;
5127 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5128 {
5129 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5130 fixed = true;
5131 }
5132 }
5133 if (!fixed)
5134 {
5135 RelocateToHomebind();
5136 mapEntry = sMapStore.LookupEntry(mapId);
5137 }
5138 }
5139
5140 if (!mapEntry || !IsPositionValid())
5141 {
5142 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (MapId: {} X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5143 RelocateToHomebind();
5144 }
5145 // Player was saved in Arena or Bg
5146 else if (mapEntry->IsBattlegroundOrArena())
5147 {
5148 // xinef: resurrect player, cant log in dead without corpse
5149 {
5152 if (!IsAlive())
5153 ResurrectPlayer(1.0f);
5154 }
5155
5156 const WorldLocation& _loc = GetEntryPoint();
5157 mapId = _loc.GetMapId();
5158 instanceId = 0;
5159
5160 if (mapId == MAPID_INVALID)
5161 {
5162 RelocateToHomebind();
5163 }
5164 else
5165 {
5166 Relocate(&_loc);
5167
5168 // xinef: restore taxi flight from entry point data
5170 {
5174 }
5175 }
5176 }
5177 // currently we do not support transport in bg
5178 else if (transLowGUID != 0)
5179 {
5180 // transLowGUID > 0 ---> motion transport guid
5181 // transLowGUID < 0 ---> static transport spawn id
5182 Transport* transGO = nullptr;
5183 if (transLowGUID > 0)
5184 {
5185 ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID);
5186 transGO = HashMapHolder<MotionTransport>::Find(transGUID);
5187 }
5188 else
5189 {
5190 map = sMapMgr->CreateMap(mapId, this);
5191 if (map)
5192 {
5193 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(std::abs(transLowGUID));
5194 if (bounds.first != bounds.second)
5195 transGO = bounds.first->second->ToTransport();
5196 }
5197 }
5198
5199 // pussywizard: must be on map, for one world tick transport is not in map and has old GetMapId(), player would be added to old map and to the transport, multithreading crashfix
5200 if (transGO && transGO->IsInWorld() && transGO->FindMap())
5201 m_transport = transGO;
5202
5203 if (m_transport)
5204 {
5205 float x = fields[31].Get<float>(), y = fields[32].Get<float>(), z = fields[33].Get<float>(), o = fields[34].Get<float>();
5209
5210 if (!Acore::IsValidMapCoord(x, y, z, o) || std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 75.0f)
5211 {
5212 m_transport = nullptr;
5215 RelocateToHomebind();
5216 }
5217 else
5218 {
5219 Relocate(x, y, z, o);
5220 mapId = m_transport->GetMapId();
5223 }
5224 }
5225 else
5226 {
5227 bool fixed = false;
5228 if (mapEntry->Instanceable())
5229 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5230 {
5231 fixed = true;
5232 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5233 }
5234 if (!fixed)
5235 RelocateToHomebind();
5236 }
5237 }
5238 // currently we do not support taxi in instance
5239 else if (!taxi_nodes.empty())
5240 {
5241 instanceId = 0;
5242 if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true)))
5243 {
5244 // xinef: could no load valid data for taxi, relocate to homebind and clear
5246 RelocateToHomebind();
5247 }
5248 }
5249
5250 // Map could be changed before
5251 mapEntry = sMapStore.LookupEntry(mapId);
5252 // client without expansion support
5253 if (mapEntry)
5254 {
5255 if (GetSession()->Expansion() < mapEntry->Expansion())
5256 {
5257 LOG_DEBUG("entities.player.loading", "Player {} using client without required expansion tried login at non accessible map {}", GetName(), mapId);
5258 RelocateToHomebind();
5259 }
5260
5261 // check whether player was unbound or is bound to another instance
5262 if (instanceId)
5263 {
5264 InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(GetGUID(), mapId, GetDifficulty(mapEntry->IsRaid()));
5265 if (!save || save->GetInstanceId() != instanceId)
5266 instanceId = 0;
5267 }
5268 }
5269
5270 // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
5271 if ((instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !mapEntry->IsBattlegroundOrArena()) || (!instanceId && mapEntry->IsDungeon()))
5272 {
5273 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
5274 if (at)
5276 else
5277 RelocateToHomebind();
5278 }
5279
5280 // NOW player must have valid map
5281 // load the player's map here if it's not already loaded
5282 if (!map)
5283 map = sMapMgr->CreateMap(mapId, this);
5284
5285 if (!map)
5286 {
5287 instanceId = 0;
5288 AreaTriggerTeleport const* at = sObjectMgr->GetGoBackTrigger(mapId);
5289 if (at)
5290 {
5291 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to gobacktrigger (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5293 mapId = at->target_mapId;
5294 }
5295 else
5296 {
5297 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to home (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5298 RelocateToHomebind();
5299 }
5300
5301 map = sMapMgr->CreateMap(mapId, this);
5302 if (!map)
5303 {
5304 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
5305 mapId = info->mapId;
5306 Relocate(info->positionX, info->positionY, info->positionZ, 0.0f);
5307 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5308 map = sMapMgr->CreateMap(mapId, this);
5309 if (!map)
5310 {
5311 LOG_ERROR("entities.player", "Player (guidlow {}) has invalid default map coordinates (X: {} Y: {} Z: {} O: {}). or instance couldn't be created", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5312 return false;
5313 }
5314 }
5315 }
5316
5317 SetMap(map);
5319
5321
5323
5324 time_t now = GameTime::GetGameTime().count();
5325 time_t logoutTime = time_t(fields[27].Get<uint32>());
5326
5327 // since last logout (in seconds)
5328 uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
5329
5330 // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
5331 // this must help in case next save after mass player load after server startup
5332 m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
5333
5334 // set value, including drunk invisibility detection
5335 // calculate sobering. after 15 minutes logged out, the player will be sober again
5336 uint8 newDrunkValue = 0;
5337 if (time_diff < uint32(GetDrunkValue()) * 9)
5338 newDrunkValue = GetDrunkValue() - time_diff / 9;
5339
5340 SetDrunkValue(newDrunkValue);
5341
5342 m_cinematic = fields[23].Get<uint8>();
5343 m_Played_time[PLAYED_TIME_TOTAL] = fields[24].Get<uint32>();
5344 m_Played_time[PLAYED_TIME_LEVEL] = fields[25].Get<uint32>();
5345
5346 m_resetTalentsCost = fields[29].Get<uint32>();
5347 m_resetTalentsTime = time_t(fields[30].Get<uint32>());
5348
5349 m_taxi.LoadTaxiMask(fields[22].Get<std::string_view>()); // must be before InitTaxiNodesForLevel
5350
5351 uint32 extraflags = fields[36].Get<uint16>();
5352
5353 _LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
5354
5355 m_atLoginFlags = fields[38].Get<uint16>();
5356
5358 {
5359 LOG_ERROR("entities.player", "Player {} tried to login while forced to rename, can't load.'", GetGUID().ToString());
5360 return false;
5361 }
5362
5363 // Honor system
5364 // Update Honor kills data
5365 m_lastHonorUpdateTime = logoutTime;
5367
5368 m_deathExpireTime = time_t(fields[41].Get<uint32>());
5369
5372
5373 // clear channel spell data (if saved at channel spell casting)
5376
5377 // clear charm/summon related fields
5384
5386
5387 // reset some aura modifiers before aura apply
5390
5391 // make sure the unit is considered not in duel for proper loading
5394
5395 // reset stats before loading any modifiers
5399 InitRunes();
5400
5401 sScriptMgr->OnPlayerLoadFromDB(this);
5402
5403 // make sure the unit is considered out of combat for proper loading
5404 ClearInCombat();
5405
5406 // rest bonus can only be calculated after InitStatsForLevel()
5407 _restBonus = fields[26].Get<float>();
5408
5409 if (time_diff > 0)
5410 {
5411 //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
5412 float bubble0 = 0.031f;
5413 //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
5414 float bubble1 = 0.125f;
5415 float bubble = fields[28].Get<uint8>() > 0
5416 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY)
5417 : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS);
5418
5419 // Client automatically doubles the value sent so we have to divide it by 2
5420 SetRestBonus(GetRestBonus() + time_diff * ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 144000)*bubble);
5421 }
5422
5423 uint32 innTriggerId = fields[72].Get<uint32>();
5424 if (innTriggerId)
5425 {
5426 SetRestFlag(REST_FLAG_IN_TAVERN, innTriggerId);
5427 }
5428
5429 // load skills after InitStatsForLevel because it triggering aura apply also
5430 _LoadSkills(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS));
5431 UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load
5432
5433 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
5434
5435 m_specsCount = fields[64].Get<uint8>();
5436 m_activeSpec = fields[65].Get<uint8>();
5437
5440
5441 _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
5442 _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));
5443
5444 _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
5446 _LoadAuras(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
5447 // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
5449 {
5450 m_deathState = DeathState::Dead;
5452 }
5453
5454 // pussywizard: remove auras that are removed at map change (after _LoadAuras)
5456
5457 // after spell load, learn rewarded spell if need also
5458 _LoadQuestStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS));
5464 _LoadRandomBGStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG));
5465
5466 // Extra Bonus Talent Points
5467 m_extraBonusTalentCount = fields[73].Get<uint8>();
5468
5469 // after spell, bonus talents, and quest load
5471
5472 // must be before inventory (some items required reputation check)
5474
5475 // xinef: load mails before inventory, so problematic items can be added to already loaded mails
5476 _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
5477
5478 _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), time_diff);
5479
5480 // update items with duration and realtime
5481 UpdateItemDuration(time_diff, true);
5482
5483 _LoadActions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
5484
5485 m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
5486
5487 // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
5488 // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
5489 uint32 curTitle = fields[51].Get<uint32>();
5490 if (curTitle && !HasTitle(curTitle))
5491 curTitle = 0;
5492
5494
5495 // has to be called after last Relocate() in Player::LoadFromDB
5497
5499
5500 // Spell code allow apply any auras to dead character in load time in aura/spell/item loading
5501 // Do now before stats re-calculation cleanup for ghost state unexpected auras
5502 if (!IsAlive())
5504 else
5506
5507 //apply all stat bonuses from items and auras
5508 SetCanModifyStats(true);
5510
5511 // restore remembered power/health values (but not more max values)
5512 uint32 savedHealth = fields[55].Get<uint32>();
5513 SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
5514 for (uint8 i = 0; i < MAX_POWERS; ++i)
5515 {
5516 uint32 savedPower = fields[56 + i].Get<uint32>();
5517 SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower);
5518 }
5519
5520 LOG_DEBUG("entities.player.loading", "The value of player {} after load item and aura is: ", m_name);
5522
5523 // GM state
5525 {
5526 switch (sWorld->getIntConfig(CONFIG_GM_LOGIN_STATE))
5527 {
5528 default:
5529 case 0:
5530 break; // disable
5531 case 1:
5532 SetGameMaster(true);
5533 break; // enable
5534 case 2: // save state
5535 if (extraflags & PLAYER_EXTRA_GM_ON)
5536 SetGameMaster(true);
5537 break;
5538 }
5539
5540 switch (sWorld->getIntConfig(CONFIG_GM_VISIBLE_STATE))
5541 {
5542 default:
5543 case 0:
5544 SetGMVisible(false);
5545 break; // invisible
5546 case 1:
5547 break; // visible
5548 case 2: // save state
5549 if (extraflags & PLAYER_EXTRA_GM_INVISIBLE)
5550 SetGMVisible(false);
5551 break;
5552 }
5553
5554 switch (sWorld->getIntConfig(CONFIG_GM_CHAT))
5555 {
5556 default:
5557 case 0:
5558 break; // disable
5559 case 1:
5560 SetGMChat(true);
5561 break; // enable
5562 case 2: // save state
5563 if (extraflags & PLAYER_EXTRA_GM_CHAT)
5564 SetGMChat(true);
5565 break;
5566 }
5567
5568 switch (sWorld->getIntConfig(CONFIG_GM_WHISPERING_TO))
5569 {
5570 default:
5571 case 0:
5572 break; // disable
5573 case 1:
5574 SetAcceptWhispers(true);
5575 break; // enable
5576 case 2: // save state
5577 if (extraflags & PLAYER_EXTRA_ACCEPT_WHISPERS)
5578 SetAcceptWhispers(true);
5579 break;
5580 }
5581 }
5582
5583 // RaF stuff.
5584 m_grantableLevels = fields[71].Get<uint8>();
5585 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
5587
5588 if (m_grantableLevels > 0)
5590
5592
5593 //m_achievementMgr->CheckAllAchievementCriteria(); // pussywizard: disabled this
5594
5596
5598
5600
5601 // Players are immune to taunt
5604
5605 // Init charm info
5607
5608 // Fix aurastate auras, depending on health!
5609 // Set aurastate manualy, prevents aura switching
5610 if (HealthBelowPct(20))
5612 if (HealthBelowPct(35))
5614 if (HealthAbovePct(75))
5616
5617 // unapply aura stats if dont meet requirements
5618 AuraApplicationMap const& Auras = GetAppliedAuras();
5619 for (AuraApplicationMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
5620 {
5621 // we assume that all auras are applied now, aurastate was modfied MANUALY preventing any apply/unapply state switching
5622 Aura* aura = itr->second->GetBase();
5623 SpellInfo const* m_spellInfo = aura->GetSpellInfo();
5627 continue;
5628
5629 if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))
5630 aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);
5631 }
5632 return true;
5633}
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
Definition: SpellDefines.h:63
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
Definition: SpellAuraDefines.h:239
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74
@ UNIT_FIELD_CHANNEL_OBJECT
Definition: UpdateFields.h:93
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87
@ UNIT_FIELD_CHARMEDBY
Definition: UpdateFields.h:89
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
@ PLAYER_TRACK_CREATURES
Definition: UpdateFields.h:344
@ PLAYER_TRACK_RESOURCES
Definition: UpdateFields.h:345
@ UNIT_CHANNEL_SPELL
Definition: UpdateFields.h:94
@ REST_FLAG_IN_TAVERN
Definition: Player.h:814
@ PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS
Definition: Player.h:876
@ PLAYER_LOGIN_QUERY_LOAD_GLYPHS
Definition: Player.h:882
@ PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES
Definition: Player.h:877
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW
Definition: Player.h:889
@ PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS
Definition: Player.h:868
@ PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS
Definition: Player.h:895
@ PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES
Definition: Player.h:890
@ PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS
Definition: Player.h:891
@ PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST
Definition: Player.h:874
@ PLAYER_LOGIN_QUERY_LOAD_ACTIONS
Definition: Player.h:871
@ PLAYER_LOGIN_QUERY_LOAD_SKILLS
Definition: Player.h:885
@ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS
Definition: Player.h:873
@ PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS
Definition: Player.h:896
@ PLAYER_LOGIN_QUERY_LOAD_INVENTORY
Definition: Player.h:870
@ PLAYER_LOGIN_QUERY_LOAD_REPUTATION
Definition: Player.h:869
@ PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH
Definition: Player.h:893
@ PLAYER_LOGIN_QUERY_LOAD_FROM
Definition: Player.h:864
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS
Definition: Player.h:867
@ PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT
Definition: Player.h:881
@ PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS
Definition: Player.h:886
@ PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS
Definition: Player.h:892
@ PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS
Definition: Player.h:880
@ PLAYER_LOGIN_QUERY_LOAD_MAILS
Definition: Player.h:872
@ PLAYER_LOGIN_QUERY_LOAD_AURAS
Definition: Player.h:865
@ PLAYER_LOGIN_QUERY_LOAD_TALENTS
Definition: Player.h:883
@ PLAYER_LOGIN_QUERY_LOAD_BANNED
Definition: Player.h:888
@ PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS
Definition: Player.h:879
@ PLAYER_LOGIN_QUERY_LOAD_HOME_BIND
Definition: Player.h:875
@ PLAYER_LOGIN_QUERY_LOAD_SPELLS
Definition: Player.h:866
@ PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG
Definition: Player.h:887
@ PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS
Definition: Player.h:878
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:353
@ UNIT_FLAG2_FORCE_MOVEMENT
Definition: UnitDefines.h:274
@ UNIT_STATE_ISOLATED
Definition: UnitDefines.h:162
@ CONFIG_GM_CHAT
Definition: IWorld.h:261
@ CONFIG_GM_WHISPERING_TO
Definition: IWorld.h:262
@ CONFIG_GM_LOGIN_STATE
Definition: IWorld.h:258
@ CONFIG_GM_VISIBLE_STATE
Definition: IWorld.h:259
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition: IWorld.h:504
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition: IWorld.h:503
@ CHAR_UPD_ADD_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:274
#define MAX_RAID_DIFFICULTY
Definition: DBCEnums.h:282
#define MAX_DUNGEON_DIFFICULTY
Definition: DBCEnums.h:281
@ SPELL_EFFECT_ATTACK_ME
Definition: SharedDefines.h:892
@ CHAR_NAME_SUCCESS
Definition: SharedDefines.h:3419
@ UNIT_DYNFLAG_REFER_A_FRIEND
Definition: SharedDefines.h:3127
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
bool IsValidMapCoord(float c)
Definition: GridDefines.h:216
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult)
Definition: AchievementMgr.cpp:612
Transport * ToTransport()
Definition: GameObject.h:322
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:120
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition: Object.cpp:612
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:331
struct MovementInfo::TransportInfo transport
void Reset()
Definition: Object.h:285
ObjectGuid guid
Definition: Object.h:294
Position pos
Definition: Object.h:295
Transport * m_transport
Definition: Object.h:652
bool IsPositionValid() const
Definition: Position.cpp:175
void ClearTaxiPath()
Definition: Player.h:1058
bool HasTaxiPath() const
Definition: Player.h:1059
void _LoadDeclinedNames(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4800
void _LoadGlyphs(PreparedQueryResult result)
Definition: Player.cpp:14904
void SetRestFlag(RestFlag restFlag, uint32 triggerId=0)
Definition: Player.cpp:16099
void SetCreationTime(Seconds creationTime)
Definition: Player.h:2514
void SetGameMaster(bool on)
Definition: Player.cpp:2204
void _LoadQuestStatusRewarded(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6329
void _LoadAuras(PreparedQueryResult result, uint32 timediff)
Definition: PlayerStorage.cpp:5714
void _LoadSeasonalQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6437
void _LoadGroup()
Definition: PlayerStorage.cpp:6495
void _LoadCharacterSettings(PreparedQueryResult result)
Definition: PlayerSettings.cpp:26
void _LoadTalents(PreparedQueryResult result)
Definition: Player.cpp:14953
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2312
void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result)
Definition: Player.cpp:15768
void _LoadBrewOfTheMonth(PreparedQueryResult result)
Definition: Player.cpp:15731
WorldLocation const & GetEntryPoint() const
Definition: Player.h:2353
void outDebugValues() const
Definition: PlayerStorage.cpp:7796
void _LoadRandomBGStatus(PreparedQueryResult result)
Definition: Player.cpp:15666
void SaveRecallPosition()
Definition: Player.cpp:5603
void _LoadQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6242
void _LoadMonthlyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6460
void SetGMChat(bool on)
Definition: Player.h:1160
void _LoadArenaTeamInfo()
Definition: PlayerStorage.cpp:4811
bool _LoadHomeBind(PreparedQueryResult result)
Definition: PlayerStorage.cpp:7002
void UpdateItemDuration(uint32 time, bool realtimeonly=false)
Definition: PlayerStorage.cpp:4160
void _LoadSpells(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6482
void _LoadSkills(PreparedQueryResult result)
Definition: Player.cpp:13619
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
Definition: PlayerStorage.cpp:6169
void _LoadWeeklyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6415
void SetGMVisible(bool on)
Definition: Player.cpp:2273
void PrepareCharmAISpells()
Definition: Player.cpp:15362
void _LoadGlyphAuras()
Definition: PlayerStorage.cpp:5797
void ReplaceAllPlayerFlags(PlayerFlags flags)
Definition: Player.h:1110
void _LoadEquipmentSets(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4842
void _LoadEntryPointData(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4873
void _LoadInstanceTimeRestrictions(PreparedQueryResult result)
Definition: Player.cpp:15719
void StoreRaidMapDifficulty()
Definition: Player.h:1902
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff)
Definition: PlayerStorage.cpp:5849
void UpdateHonorFields()
Definition: PlayerUpdates.cpp:1137
void _LoadSpellCooldowns(PreparedQueryResult result)
Definition: Player.cpp:3566
void SetMoney(uint32 value)
Definition: Player.h:1602
void _LoadDailyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6364
bool LoadTaxiMask(std::string_view data)
Definition: PlayerTaxi.cpp:89
bool LoadTaxiDestinationsFromString(std::string const &values, TeamId teamId)
Definition: PlayerTaxi.cpp:130
virtual void AddPassenger(WorldObject *passenger, bool withAll=false)=0
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
Definition: Transport.h:32
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:788
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13324
void RemoveAllAurasRequiringDeadTarget()
Definition: Unit.cpp:5323
DeathState m_deathState
Definition: Unit.h:1833
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5300
void AddUnitState(uint32 f)
Definition: Unit.h:738
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:786
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:1615
void RemoveUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:833
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10513
void ClearInCombat()
Definition: Unit.cpp:13738
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:1160
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5132
static T * Find(ObjectGuid guid)
Definition: ObjectAccessor.cpp:56
Definition: ObjectMgr.h:412
float target_Z
Definition: ObjectMgr.h:416
float target_X
Definition: ObjectMgr.h:414
float target_Orientation
Definition: ObjectMgr.h:417
float target_Y
Definition: ObjectMgr.h:415
uint32 target_mapId
Definition: ObjectMgr.h:413
static uint8 CheckPlayerName(std::string_view name, bool create=false)
Definition: ObjectMgr.cpp:8375
uint32 GetInstanceId() const
Definition: InstanceSaveMgr.h:61
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition: Map.h:523
void LoadFromDB(PreparedQueryResult result)
Definition: ReputationMgr.cpp:561
void SetPlayer(Player *player)
Definition: WorldSession.cpp:1258
bool IsARecruiter() const
Definition: WorldSession.h:527
uint32 CasterAuraState
Definition: SpellInfo.h:339
bool IsNonRaidDungeon() const
Definition: DBCStructure.h:1352
uint32 Expansion() const
Definition: DBCStructure.h:1349
bool IsBattlegroundOrArena() const
Definition: DBCStructure.h:1357
bool IsDungeon() const
Definition: DBCStructure.h:1351
bool IsRaid() const
Definition: DBCStructure.h:1354
bool Instanceable() const
Definition: DBCStructure.h:1353

References Object::_Create(), _LoadActions(), _LoadArenaTeamInfo(), _LoadAuras(), _LoadBrewOfTheMonth(), _LoadCharacterSettings(), _LoadDailyQuestStatus(), _LoadDeclinedNames(), _LoadEntryPointData(), _LoadEquipmentSets(), _LoadGlyphAuras(), _LoadGlyphs(), _LoadGroup(), _LoadHomeBind(), _LoadInstanceTimeRestrictions(), Object::_LoadIntoDataField(), _LoadInventory(), _LoadMail(), _LoadMonthlyQuestStatus(), _LoadPetStable(), _LoadQuestStatus(), _LoadQuestStatusRewarded(), _LoadRandomBGStatus(), _LoadSeasonalQuestStatus(), _LoadSkills(), _LoadSpellCooldowns(), _LoadSpells(), _LoadTalents(), _LoadWeeklyQuestStatus(), _restBonus, Transport::AddPassenger(), PlayerTaxi::AddTaxiDestination(), Unit::AddUnitMovementFlag(), Unit::AddUnitState(), Unit::ApplySpellImmune(), AT_LOGIN_RENAME, AURA_EFFECT_HANDLE_REAL, AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Transport::CalculatePassengerPosition(), SpellInfo::CasterAuraState, CHAR_NAME_SUCCESS, CHAR_UPD_ADD_AT_LOGIN_FLAG, CharacterDatabase, ObjectMgr::CheckPlayerName(), Unit::ClearInCombat(), PlayerTaxi::ClearTaxiDestinations(), EntryPointData::ClearTaxiPath(), CONFIG_GM_CHAT, CONFIG_GM_LOGIN_STATE, CONFIG_GM_VISIBLE_STATE, CONFIG_GM_WHISPERING_TO, DEATH_EXPIRE_STEP, DUNGEON_DIFFICULTY_NORMAL, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, MapEntry::Expansion(), HashMapHolder< T >::Find(), WorldObject::FindMap(), Field::Get(), WorldSession::GetAccountId(), Unit::GetAppliedAuras(), Unit::getClass(), ObjectGuid::GetCounter(), GetDifficulty(), GetDrunkValue(), GetDungeonDifficulty(), GetEntryPoint(), Map::GetGameObjectBySpawnIdStore(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMaxHealth(), Unit::GetMaxPower(), WorldObject::GetName(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), SQLQueryHolderBase::GetPreparedResult(), Unit::getRace(), GetRaidDifficulty(), WorldSession::GetRecruiterId(), GetRestBonus(), GetSession(), Aura::GetSpellInfo(), GetTeamId(), Object::GetUInt32Value(), MovementInfo::TransportInfo::guid, Aura::HandleAllEffects(), HasAtLoginFlag(), Unit::HasAuraState(), Unit::HasAuraType(), HasPlayerFlag(), EntryPointData::HasTaxiPath(), HasTitle(), Unit::HealthAbovePct(), Unit::HealthBelowPct(), IMMUNITY_EFFECT, IMMUNITY_STATE, InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), MapEntry::Instanceable(), Unit::IsAlive(), WorldSession::IsARecruiter(), MapEntry::IsBattlegroundOrArena(), MapEntry::IsDungeon(), Object::IsInWorld(), MapEntry::IsNonRaidDungeon(), AccountMgr::IsPlayerAccount(), Position::IsPositionValid(), MapEntry::IsRaid(), IsValidGender(), Acore::IsValidMapCoord(), KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), AchievementMgr::LoadFromDB(), ReputationMgr::LoadFromDB(), PlayerTaxi::LoadTaxiDestinationsFromString(), PlayerTaxi::LoadTaxiMask(), LOG_DEBUG, LOG_ERROR, LOG_WARN, m_achievementMgr, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, Unit::m_deathState, m_entryPointData, m_extraBonusTalentCount, m_grantableLevels, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_items, m_lastHonorUpdateTime, WorldObject::m_movementInfo, WorldObject::m_name, m_nextSave, m_Played_time, Unit::m_race, Unit::m_realRace, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_social, m_specsCount, m_taxi, WorldObject::m_transport, PlayerInfo::mapId, MAPID_INVALID, MAX_DEATH_COUNT, MAX_DUNGEON_DIFFICULTY, MAX_MONEY_AMOUNT, MAX_POWERS, MAX_RAID_DIFFICULTY, MOVEMENTFLAG_ONTRANSPORT, outDebugValues(), PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_EXTRA_ACCEPT_WHISPERS, PLAYER_EXTRA_GM_CHAT, PLAYER_EXTRA_GM_INVISIBLE, PLAYER_EXTRA_GM_ON, PLAYER_FARSIGHT, PLAYER_FIELD_BYTES, PLAYER_FIELD_INV_SLOT_HEAD, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_GHOST, PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS, PLAYER_LOGIN_QUERY_LOAD_ACTIONS, PLAYER_LOGIN_QUERY_LOAD_AURAS, PLAYER_LOGIN_QUERY_LOAD_BANNED, PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH, PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS, PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES, PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_FROM, PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_HOME_BIND, PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_INVENTORY, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, PLAYER_LOGIN_QUERY_LOAD_MAILS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW, PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG, PLAYER_LOGIN_QUERY_LOAD_REPUTATION, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_SKILLS, PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS, PLAYER_LOGIN_QUERY_LOAD_SPELLS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS, PLAYER_NEXT_LEVEL_XP, PLAYER_TRACK_CREATURES, PLAYER_TRACK_RESOURCES, PLAYER_XP, MovementInfo::TransportInfo::pos, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PrepareCharmAISpells(), RAID_DIFFICULTY_10MAN_NORMAL, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, RATE_REST_OFFLINE_IN_WILDERNESS, Position::Relocate(), Unit::RemoveAllAurasOnDeath(), Unit::RemoveAllAurasRequiringDeadTarget(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Unit::RemoveUnitFlag2(), ReplaceAllPlayerFlags(), MovementInfo::TransportInfo::Reset(), REST_FLAG_IN_TAVERN, ResurrectPlayer(), SaveRecallPosition(), SetAcceptWhispers(), SetArenaPoints(), Object::SetByteValue(), Unit::SetCanModifyStats(), SetCreationTime(), Unit::SetCreatorGUID(), PreparedStatementBase::SetData(), SetDrunkValue(), SetDungeonDifficulty(), Object::SetDynamicFlag(), SetFactionForRace(), SetFallInformation(), Object::SetFlag(), Object::SetFloatValue(), SetGameMaster(), SetGMChat(), SetGMVisible(), Object::SetGuidValue(), Unit::SetHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), SetMoney(), SetObjectScale(), Unit::SetOwnerGUID(), WorldSession::SetPlayer(), Unit::SetPower(), SetRaidDifficulty(), SetRestBonus(), SetRestFlag(), Object::SetUInt16Value(), Unit::SetUInt32Value(), Object::SetUInt64Value(), SetVisibleItemSlot(), sInstanceSaveMgr, sMapMgr, sMapStore, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOD_TAUNT, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_EFFECT_ATTACK_ME, sScriptMgr, sSocialMgr, StoreRaidMapDifficulty(), sWorld, AreaTriggerTeleport::target_mapId, AreaTriggerTeleport::target_Orientation, AreaTriggerTeleport::target_X, AreaTriggerTeleport::target_Y, AreaTriggerTeleport::target_Z, EntryPointData::taxiPath, ObjectGuid::ToString(), Position::ToString(), GameObject::ToTransport(), MovementInfo::transport, UNIT_CHANNEL_SPELL, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_AURASTATE, UNIT_FIELD_BYTES_0, UNIT_FIELD_CHANNEL_OBJECT, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FIELD_SUMMON, UNIT_FLAG2_FORCE_MOVEMENT, UNIT_STATE_ISOLATED, UpdateAllStats(), UpdateHonorFields(), UpdateItemDuration(), WorldObject::UpdatePositionData(), UpdateSkillsForLevel(), and urand().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPet()

void Player::LoadPet ( )
6231{
6232 //fixme: the pet should still be loaded if the player is not in world
6233 // just not added to the map
6234 if (m_petStable && IsInWorld())
6235 {
6236 Pet* pet = new Pet(this);
6237 if (!pet->LoadPetFromDB(this, 0, 0, true))
6238 delete pet;
6239 }
6240}
bool LoadPetFromDB(Player *owner, uint32 petEntry, uint32 petnumber, bool current, uint32 healthPct=0, bool fullMana=false)
Definition: Pet.cpp:215

References Object::IsInWorld(), Pet::LoadPetFromDB(), and m_petStable.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPositionFromDB()

bool Player::LoadPositionFromDB ( uint32 mapid,
float &  x,
float &  y,
float &  z,
float &  o,
bool &  in_flight,
ObjectGuid::LowType  guid 
)
static
4891{
4893 stmt->SetData(0, guid);
4894 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4895
4896 if (!result)
4897 return false;
4898
4899 Field* fields = result->Fetch();
4900
4901 x = fields[0].Get<float>();
4902 y = fields[1].Get<float>();
4903 z = fields[2].Get<float>();
4904 o = fields[3].Get<float>();
4905 mapid = fields[4].Get<uint16>();
4906 in_flight = !fields[5].Get<std::string>().empty();
4907
4908 return true;
4909}
@ CHAR_SEL_CHAR_POSITION
Definition: CharacterDatabase.h:54

References CHAR_SEL_CHAR_POSITION, CharacterDatabase, Field::Get(), and PreparedStatementBase::SetData().

Referenced by misc_commandscript::HandleAppearCommand().

◆ ModifyArenaPoints()

void Player::ModifyArenaPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)

If trans is specified, honor save query will be added to trans.

6244{
6245 int32 newValue = int32(GetArenaPoints()) + value;
6246 if (newValue < 0)
6247 newValue = 0;
6248 SetArenaPoints(uint32(newValue));
6249
6250 if (trans)
6251 {
6253 stmt->SetData(0, newValue);
6254 stmt->SetData(1, GetGUID().GetCounter());
6255 trans->Append(stmt);
6256 }
6257}
@ CHAR_UDP_CHAR_ARENA_POINTS
Definition: CharacterDatabase.h:422

References CHAR_UDP_CHAR_ARENA_POINTS, CharacterDatabase, GetArenaPoints(), Object::GetGUID(), SetArenaPoints(), and PreparedStatementBase::SetData().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyArenaCommand(), RefundItem(), and RewardQuest().

◆ ModifyHonorPoints()

void Player::ModifyHonorPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)
6228{
6229 int32 newValue = int32(GetHonorPoints()) + value;
6230 if (newValue < 0)
6231 newValue = 0;
6232 SetHonorPoints(uint32(newValue));
6233
6234 if (trans)
6235 {
6237 stmt->SetData(0, newValue);
6238 stmt->SetData(1, GetGUID().GetCounter());
6239 trans->Append(stmt);
6240 }
6241}
@ CHAR_UDP_CHAR_HONOR_POINTS
Definition: CharacterDatabase.h:420

References CHAR_UDP_CHAR_HONOR_POINTS, CharacterDatabase, Object::GetGUID(), GetHonorPoints(), PreparedStatementBase::SetData(), and SetHonorPoints().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyHonorCommand(), RefundItem(), and RewardHonor().

◆ ModifyMoney()

bool Player::ModifyMoney ( int32  amount,
bool  sendError = true 
)
11468{
11469 if (!amount)
11470 return true;
11471
11472 sScriptMgr->OnPlayerMoneyChanged(this, amount);
11473
11474 if (amount < 0)
11475 SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
11476 else
11477 {
11478 if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
11479 SetMoney(GetMoney() + amount);
11480 else
11481 {
11482 if (sendError)
11483 SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr);
11484 return false;
11485 }
11486 }
11487
11488 return true;
11489}
@ EQUIP_ERR_TOO_MUCH_GOLD
Definition: Item.h:123

References EQUIP_ERR_TOO_MUCH_GOLD, GetMoney(), MAX_MONEY_AMOUNT, SendEquipError(), SetMoney(), and sScriptMgr.

Referenced by _StoreOrEquipNewItem(), ActivateTaxiPathTo(), FlightPathMovementGenerator::DoUpdate(), DurabilityRepair(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyBankSlotOpcode(), Guild::HandleBuyBankTab(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), modify_commandscript::HandleModifyMoneyCommand(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), Guild::HandleSetEmblem(), WorldSession::HandleTrainerBuySpellOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), ProcessCastaction(), ProcessUnlearnAction(), RefundItem(), resetTalents(), RewardQuest(), and SetHonorPoints().

◆ ModifySkillBonus()

void Player::ModifySkillBonus ( uint32  skillid,
int32  val,
bool  talent 
)
5253{
5254 SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
5255 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5256 return;
5257
5258 uint32 bonusIndex = PLAYER_SKILL_BONUS_INDEX(itr->second.pos);
5259
5260 uint32 bonus_val = GetUInt32Value(bonusIndex);
5261 int16 temp_bonus = SKILL_TEMP_BONUS(bonus_val);
5262 int16 perm_bonus = SKILL_PERM_BONUS(bonus_val);
5263
5264 if (talent) // permanent bonus stored in high part
5265 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus, perm_bonus + val));
5266 else // temporary/item bonus stored in low part
5267 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus + val, perm_bonus));
5268}
#define MAKE_SKILL_BONUS(t, p)
Definition: Player.h:88

References Object::GetUInt32Value(), MAKE_SKILL_BONUS, mSkillStatus, PLAYER_SKILL_BONUS_INDEX, Unit::SetUInt32Value(), SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_TEMP_BONUS.

Referenced by AuraEffect::HandleAuraModSkill().

◆ ModifySpellCooldown()

void Player::ModifySpellCooldown ( uint32  spellId,
int32  cooldown 
)
11047{
11048 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellId);
11049 if (itr == m_spellCooldowns.end())
11050 return;
11051
11052 itr->second.end += cooldown;
11053
11054 WorldPacket data(SMSG_MODIFY_COOLDOWN, 4 + 8 + 4);
11055 data << uint32(spellId); // Spell ID
11056 data << GetGUID(); // Player GUID
11057 data << int32(cooldown); // Cooldown mod in milliseconds
11058 GetSession()->SendPacket(&data);
11059}
@ SMSG_MODIFY_COOLDOWN
Definition: Opcodes.h:1199

References Object::GetGUID(), GetSession(), m_spellCooldowns, WorldSession::SendPacket(), and SMSG_MODIFY_COOLDOWN.

◆ MoneyChanged()

void Player::MoneyChanged ( uint32  value)
2166{
2167 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2168 {
2169 uint32 questid = GetQuestSlotQuestId(i);
2170 if (!questid)
2171 continue;
2172
2173 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2174 {
2175 int32 rewOrReqMoney = qInfo->GetRewOrReqMoney();
2176 if (rewOrReqMoney < 0)
2177 {
2178 QuestStatusData& q_status = m_QuestStatus[questid];
2179
2180 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2181 {
2182 if (int32(count) >= -rewOrReqMoney)
2183 {
2184 if (CanCompleteQuest(questid))
2185 {
2186 CompleteQuest(questid);
2187 }
2188 }
2189 }
2190 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2191 {
2192 if (int32(count) < -rewOrReqMoney)
2193 {
2194 IncompleteQuest(questid);
2195 }
2196 }
2197 }
2198 }
2199 }
2200}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by SetMoney().

◆ MoveItemFromInventory()

void Player::MoveItemFromInventory ( uint8  bag,
uint8  slot,
bool  update 
)
2994{
2995 if (Item* it = GetItemByPos(bag, slot))
2996 {
2997 ItemRemovedQuestCheck(it->GetEntry(), it->GetCount());
2998 RemoveItem(bag, slot, update);
3000 it->SetNotRefundable(this, false);
3001 it->RemoveFromUpdateQueueOf(this);
3002 if (it->IsInWorld())
3003 {
3004 it->RemoveFromWorld();
3005 it->DestroyForPlayer(this);
3006 }
3007
3008 sScriptMgr->OnAfterPlayerMoveItemFromInventory(this, it, bag, slot, update);
3009 }
3010}

References GetItemByPos(), ItemRemovedQuestCheck(), RemoveItem(), sScriptMgr, and UpdateTitansGrip().

Referenced by AutoUnequipOffhandIfNeed(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionSellItem(), and WorldSession::HandleSendMail().

◆ MoveItemToInventory()

void Player::MoveItemToInventory ( ItemPosCountVec const &  dest,
Item pItem,
bool  update,
bool  in_characterInventoryDB = false 
)
3014{
3015 // update quest counters
3016 ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3018
3019 // store item
3020 Item* pLastItem = StoreItem(dest, pItem, update);
3021
3022 // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way)
3023 if (pLastItem == pItem)
3024 {
3025 // update owner for last item (this can be original item with wrong owner
3026 if (pLastItem->GetOwnerGUID() != GetGUID())
3027 pLastItem->SetOwnerGUID(GetGUID());
3028
3029 // if this original item then it need create record in inventory
3030 // in case trade we already have item in other player inventory
3031 pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this);
3032
3033 if (pLastItem->IsBOPTradable())
3034 AddTradeableItem(pLastItem);
3035 }
3036}
ObjectGuid GetOwnerGUID() const
Definition: Item.h:231

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, AddTradeableItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetOwnerGUID(), Item::IsBOPTradable(), ITEM_CHANGED, ITEM_NEW, ItemAddedQuestCheck(), Item::SetOwnerGUID(), Item::SetState(), StoreItem(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMailTakeItem(), and WorldSession::moveItems().

◆ MustDelayTeleport()

bool Player::MustDelayTeleport ( ) const
inlineprivate
2907{ return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end

References m_bMustDelayTeleport.

Referenced by TeleportTo().

◆ NeedSendSpectatorData()

bool Player::NeedSendSpectatorData ( ) const
15351{
15352 if (FindMap() && FindMap()->IsBattleArena() && !IsSpectator())
15353 {
15354 Battleground* bg = ((BattlegroundMap*)FindMap())->GetBG();
15355 if (bg && bg->HaveSpectators() && bg->GetStatus() == STATUS_IN_PROGRESS && !bg->GetPlayers().empty())
15356 if (bg->GetPlayers().find(GetGUID()) != bg->GetPlayers().end())
15357 return true;
15358 }
15359 return false;
15360}
bool HaveSpectators()
Definition: Battleground.h:390
BattlegroundPlayerMap const & GetPlayers() const
Definition: Battleground.h:401
bool IsSpectator() const
Definition: Player.h:2552
Definition: Map.h:853

References WorldObject::FindMap(), Object::GetGUID(), Battleground::GetPlayers(), Battleground::GetStatus(), Battleground::HaveSpectators(), IsSpectator(), and STATUS_IN_PROGRESS.

Referenced by _AddSpellCooldown(), Spell::cancel(), RemovePet(), Spell::SendChannelStart(), SendClearCooldown(), Spell::SendSpellStart(), setDeathState(), Unit::SetHealth(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), SetSelection(), and SummonPet().

◆ NeedToSaveGlyphs()

bool Player::NeedToSaveGlyphs ( )
inline
2577{ return m_NeedToSaveGlyphs; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs().

◆ OCTRegenHPPerSpirit()

float Player::OCTRegenHPPerSpirit ( )
5161{
5162 uint8 level = GetLevel();
5163 uint32 pclass = getClass();
5164
5165 if (level > GT_MAX_LEVEL)
5166 level = GT_MAX_LEVEL;
5167
5168 GtOCTRegenHPEntry const* baseRatio = sGtOCTRegenHPStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5169 GtRegenHPPerSptEntry const* moreRatio = sGtRegenHPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5170 if (!baseRatio || !moreRatio)
5171 return 0.0f;
5172
5173 // Formula from PaperDollFrame script
5174 float spirit = GetStat(STAT_SPIRIT);
5175 float baseSpirit = spirit;
5176 if (baseSpirit > 50)
5177 baseSpirit = 50;
5178 float moreSpirit = spirit - baseSpirit;
5179 float regen = (baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio) * 2;
5180 return regen;
5181}
DBCStorage< GtRegenHPPerSptEntry > sGtRegenHPPerSptStore(GtRegenHPPerSptfmt)
DBCStorage< GtOCTRegenHPEntry > sGtOCTRegenHPStore(GtOCTRegenHPfmt)
Definition: DBCStructure.h:1082
float ratio
Definition: DBCStructure.h:1083
Definition: DBCStructure.h:1092
float ratio
Definition: DBCStructure.h:1093

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtOCTRegenHPEntry::ratio, GtRegenHPPerSptEntry::ratio, sGtOCTRegenHPStore, sGtRegenHPPerSptStore, and STAT_SPIRIT.

Referenced by RegenerateHealth().

◆ OCTRegenMPPerSpirit()

float Player::OCTRegenMPPerSpirit ( )
5184{
5185 uint8 level = GetLevel();
5186 uint32 pclass = getClass();
5187
5188 if (level > GT_MAX_LEVEL)
5189 level = GT_MAX_LEVEL;
5190
5191 // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1);
5192 GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5193 if (!moreRatio)
5194 return 0.0f;
5195
5196 // Formula get from PaperDollFrame script
5197 float spirit = GetStat(STAT_SPIRIT);
5198 float regen = spirit * moreRatio->ratio;
5199 return regen;
5200}
DBCStorage< GtRegenMPPerSptEntry > sGtRegenMPPerSptStore(GtRegenMPPerSptfmt)
Definition: DBCStructure.h:1097
float ratio
Definition: DBCStructure.h:1098

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtRegenMPPerSptEntry::ratio, sGtRegenMPPerSptStore, and STAT_SPIRIT.

Referenced by UpdateManaRegen().

◆ OfflineResurrect()

◆ OnGossipSelect()

void Player::OnGossipSelect ( WorldObject source,
uint32  gossipListId,
uint32  menuId 
)
245{
247
248 // if not same, then something funky is going on
249 if (menuId != gossipMenu.GetMenuId())
250 return;
251
252 GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
253 if (!item)
254 return;
255
256 uint32 gossipOptionId = item->OptionType;
257 ObjectGuid guid = source->GetGUID();
258
259 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->GetTypeId() == TYPEID_UNIT)
260 {
262 {
264
267 else
269
271 return;
272 }
273 }
274
275 if (source->GetTypeId() == TYPEID_GAMEOBJECT)
276 {
277 if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER)
278 {
279 LOG_ERROR("entities.player", "Player guid {} request invalid gossip option for GameObject entry {}", GetGUID().ToString(), source->GetEntry());
280 return;
281 }
282 }
283
284 GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
285 if (!menuItemData)
286 return;
287
288 int32 cost = int32(item->BoxMoney);
289 if (!HasEnoughMoney(cost))
290 {
293 return;
294 }
295
296 switch (gossipOptionId)
297 {
300 {
301 if (menuItemData->GossipActionPoi)
303
304 if (menuItemData->GossipActionMenuId)
305 {
306 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
307 SendPreparedGossip(source);
308 }
309
310 break;
311 }
313 sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId);
314 break;
316 if (isDead())
317 source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID());
318 break;
320 PrepareQuestMenu(guid);
321 SendPreparedQuest(guid);
322 break;
325 GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId);
326 break;
328 GetSession()->SendStablePet(guid);
329 break;
332 break;
334 if (GetSpecsCount() == 1 && GetLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
335 {
336 // Cast spells that teach dual spec
337 // Both are also ImplicitTarget self and must be cast by player
338 CastSpell(this, 63680, true, nullptr, nullptr, GetGUID());
339 CastSpell(this, 63624, true, nullptr, nullptr, GetGUID());
340
341 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
342 SendPreparedGossip(source);
343 }
344 break;
348 break;
352 break;
354 GetSession()->SendTaxiMenu(source->ToCreature());
355 break;
358 SetBindPoint(guid);
359 break;
361 GetSession()->SendShowBank(guid);
362 break;
366 break;
370 break;
372 GetSession()->SendAuctionHello(guid, source->ToCreature());
373 break;
375 PrepareGossipMenu(source);
376 SendPreparedGossip(source);
377 break;
379 {
380 BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
381
382 if (bgTypeId == BATTLEGROUND_TYPE_NONE)
383 {
384 LOG_ERROR("entities.player", "A user ({}) requested battlegroundlist from a npc who is no battlemaster", GetGUID().ToString());
385 return;
386 }
387
388 GetSession()->SendBattleGroundList(guid, bgTypeId);
389 break;
390 }
391 }
392
393 ModifyMoney(-cost);
394}
@ GOSSIP_OPTION_AUCTIONEER
Definition: GossipDef.h:47
@ GOSSIP_OPTION_UNLEARNTALENTS
Definition: GossipDef.h:50
@ GOSSIP_OPTION_TRAINER
Definition: GossipDef.h:39
@ GOSSIP_OPTION_ARMORER
Definition: GossipDef.h:49
@ GOSSIP_OPTION_UNLEARNPETTALENTS
Definition: GossipDef.h:51
@ GOSSIP_OPTION_VENDOR
Definition: GossipDef.h:37
@ GOSSIP_OPTION_OUTDOORPVP
Definition: GossipDef.h:53
@ GOSSIP_OPTION_BATTLEFIELD
Definition: GossipDef.h:46
@ GOSSIP_OPTION_TABARDDESIGNER
Definition: GossipDef.h:45
@ GOSSIP_OPTION_TAXIVENDOR
Definition: GossipDef.h:38
@ GOSSIP_OPTION_QUESTGIVER
Definition: GossipDef.h:36
@ GOSSIP_OPTION_LEARNDUALSPEC
Definition: GossipDef.h:52
@ GOSSIP_OPTION_INNKEEPER
Definition: GossipDef.h:42
@ GOSSIP_OPTION_SPIRITGUIDE
Definition: GossipDef.h:41
@ GOSSIP_OPTION_DUALSPEC_INFO
Definition: GossipDef.h:54
@ GOSSIP_OPTION_PETITIONER
Definition: GossipDef.h:44
@ GOSSIP_OPTION_BANKER
Definition: GossipDef.h:43
@ GOSSIP_OPTION_GOSSIP
Definition: GossipDef.h:35
@ GOSSIP_OPTION_SPIRITHEALER
Definition: GossipDef.h:40
@ GOSSIP_OPTION_STABLEPET
Definition: GossipDef.h:48
@ GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT
Definition: Player.h:1017
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition: UnitDefines.h:307
@ LANG_INSTANT_FLIGHT_OFF
Definition: Language.h:1316
@ LANG_INSTANT_FLIGHT_ON
Definition: Language.h:1315
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition: IWorld.h:241
BattlegroundTypeId
Definition: SharedDefines.h:3479
@ BATTLEGROUND_TYPE_NONE
Definition: SharedDefines.h:3480
void SendNotification(std::string_view str)
Definition: Chat.cpp:107
Definition: GossipDef.h:131
uint32 OptionType
Definition: GossipDef.h:136
uint32 BoxMoney
Definition: GossipDef.h:138
Definition: GossipDef.h:145
uint32 GossipActionMenuId
Definition: GossipDef.h:146
uint32 GossipActionPoi
Definition: GossipDef.h:147
Definition: GossipDef.h:162
GossipMenuItem const * GetItem(uint32 id) const
Definition: GossipDef.h:187
uint32 GetMenuId() const
Definition: GossipDef.h:171
GossipMenuItemData const * GetItemData(uint32 indexId) const
Definition: GossipDef.h:196
void SendCloseGossip()
Definition: GossipDef.cpp:239
void SendPointOfInterest(uint32 poiId) const
Definition: GossipDef.cpp:247
GossipMenu & GetGossipMenu()
Definition: GossipDef.h:263
Unit * ToUnit()
Definition: Object.h:204
void SendTalentWipeConfirm(ObjectGuid guid)
Definition: Player.cpp:8834
void SendPreparedGossip(WorldObject *source)
Definition: PlayerGossip.cpp:209
void SendPreparedQuest(ObjectGuid guid)
Definition: PlayerQuest.cpp:115
void ToggleInstantFlight()
Definition: PlayerGossip.cpp:437
void ResetPetTalents()
Definition: Player.cpp:8843
void PrepareQuestMenu(ObjectGuid guid)
Definition: PlayerQuest.cpp:39
void SetBindPoint(ObjectGuid guid)
Definition: Player.cpp:8827
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition: PlayerGossip.cpp:32
NPCFlags GetNpcFlags() const
Definition: Unit.h:990
void SendAuctionHello(ObjectGuid guid, Creature *unit)
Definition: AuctionHouseHandler.cpp:54
void SendPetitionShowList(ObjectGuid guid)
Definition: PetitionsHandler.cpp:824
void SendTaxiMenu(Creature *unit)
Definition: TaxiHandler.cpp:85
void SendListInventory(ObjectGuid guid, uint32 vendorEntry=0)
Definition: ItemHandler.cpp:1035
void SendTrainerList(ObjectGuid guid)
Definition: NPCHandler.cpp:87
void SendShowBank(ObjectGuid guid)
Definition: BankHandler.cpp:189
void SendStablePet(ObjectGuid guid)
Definition: NPCHandler.cpp:480
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId=BATTLEGROUND_RB)
Definition: BattleGroundHandler.cpp:65
void SendTabardVendorActivate(ObjectGuid guid)
Definition: NPCHandler.cpp:65

References BATTLEGROUND_TYPE_NONE, GossipMenuItem::BoxMoney, BUY_ERR_NOT_ENOUGHT_MONEY, Unit::CastSpell(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, Object::GetEntry(), PlayerMenu::GetGossipMenu(), Object::GetGUID(), GossipMenu::GetItem(), GossipMenu::GetItemData(), Unit::GetLevel(), GossipMenu::GetMenuId(), Unit::GetNpcFlags(), GetSession(), GetSpecsCount(), Object::GetTypeId(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, GossipMenuItemData::GossipActionMenuId, GossipMenuItemData::GossipActionPoi, HasEnoughMoney(), Unit::isDead(), LANG_INSTANT_FLIGHT_OFF, LANG_INSTANT_FLIGHT_ON, LOG_ERROR, m_isInstantFlightOn, ModifyMoney(), GossipMenuItem::OptionType, PlayerTalkClass, PrepareGossipMenu(), PrepareQuestMenu(), ResetPetTalents(), sBattlegroundMgr, WorldSession::SendAuctionHello(), WorldSession::SendBattleGroundList(), SendBuyError(), PlayerMenu::SendCloseGossip(), WorldSession::SendListInventory(), ChatHandler::SendNotification(), WorldSession::SendPetitionShowList(), PlayerMenu::SendPointOfInterest(), SendPreparedGossip(), SendPreparedQuest(), WorldSession::SendShowBank(), WorldSession::SendStablePet(), WorldSession::SendTabardVendorActivate(), SendTalentWipeConfirm(), WorldSession::SendTaxiMenu(), WorldSession::SendTrainerList(), SetBindPoint(), sOutdoorPvPMgr, sWorld, Object::ToCreature(), ToggleInstantFlight(), Position::ToString(), Object::ToUnit(), TYPEID_GAMEOBJECT, TYPEID_UNIT, and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ outDebugValues()

void Player::outDebugValues ( ) const
protected
7797{
7798 if (!sLog->ShouldLog("entities.player", LogLevel::LOG_LEVEL_DEBUG)) // optimize disabled debug output
7799 return;
7800
7801 LOG_DEBUG("entities.player", "HP is: \t\t\t{}\t\tMP is: \t\t\t{}", GetMaxHealth(), GetMaxPower(POWER_MANA));
7802 LOG_DEBUG("entities.player", "AGILITY is: \t\t{}\t\tSTRENGTH is: \t\t{}", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));
7803 LOG_DEBUG("entities.player", "INTELLECT is: \t\t{}\t\tSPIRIT is: \t\t{}", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT));
7804 LOG_DEBUG("entities.player", "STAMINA is: \t\t{}", GetStat(STAT_STAMINA));
7805 LOG_DEBUG("entities.player", "Armor is: \t\t{}\t\tBlock is: \t\t{}", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE));
7806 LOG_DEBUG("entities.player", "HolyRes is: \t\t{}\t\tFireRes is: \t\t{}", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE));
7807 LOG_DEBUG("entities.player", "NatureRes is: \t\t{}\t\tFrostRes is: \t\t{}", GetResistance(SPELL_SCHOOL_NATURE), GetResistance(SPELL_SCHOOL_FROST));
7808 LOG_DEBUG("entities.player", "ShadowRes is: \t\t{}\t\tArcaneRes is: \t\t{}", GetResistance(SPELL_SCHOOL_SHADOW), GetResistance(SPELL_SCHOOL_ARCANE));
7809 LOG_DEBUG("entities.player", "MIN_DAMAGE is: \t\t{}\tMAX_DAMAGE is: \t\t{}", GetFloatValue(UNIT_FIELD_MINDAMAGE), GetFloatValue(UNIT_FIELD_MAXDAMAGE));
7810 LOG_DEBUG("entities.player", "MIN_OFFHAND_DAMAGE is: \t{}\tMAX_OFFHAND_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE), GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE));
7811 LOG_DEBUG("entities.player", "MIN_RANGED_DAMAGE is: \t{}\tMAX_RANGED_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE), GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE));
7812 LOG_DEBUG("entities.player", "ATTACK_TIME is: \t{}\t\tRANGE_ATTACK_TIME is: \t{}", GetAttackTime(BASE_ATTACK), GetAttackTime(RANGED_ATTACK));
7813}
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
#define sLog
Definition: Log.h:125
uint32 GetArmor() const
Definition: Unit.h:774

References BASE_ATTACK, Unit::GetArmor(), Unit::GetAttackTime(), Object::GetFloatValue(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), LOG_DEBUG, PLAYER_BLOCK_PERCENTAGE, POWER_MANA, RANGED_ATTACK, sLog, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_SHADOW, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by LoadFromDB(), and SaveToDB().

◆ PetSpellInitialize()

void Player::PetSpellInitialize ( )
9425{
9426 Pet* pet = GetPet();
9427
9428 if (!pet)
9429 return;
9430
9431 LOG_DEBUG("entities.pet", "Pet Spells Groups");
9432
9433 CharmInfo* charmInfo = pet->GetCharmInfo();
9434
9435 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9436 data << pet->GetGUID();
9437 data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents)
9438 data << uint32(pet->GetDuration().count());
9439 data << uint8(pet->GetReactState());
9440 data << uint8(charmInfo->GetCommandState());
9441 data << uint16(0); // Flags, mostly unknown
9442
9443 // action bar loop
9444 charmInfo->BuildActionBar(&data);
9445
9446 std::size_t spellsCountPos = data.wpos();
9447
9448 // spells count
9449 uint8 addlist = 0;
9450 data << uint8(addlist); // placeholder
9451
9452 if (pet->IsPermanentPetFor(this))
9453 {
9454 // spells loop
9455 for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
9456 {
9457 if (itr->second.state == PETSPELL_REMOVED)
9458 continue;
9459
9460 data << uint32(MAKE_UNIT_ACTION_BUTTON(itr->first, itr->second.active));
9461 ++addlist;
9462 }
9463 }
9464
9465 data.put<uint8>(spellsCountPos, addlist);
9466
9467 uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size();
9468 data << uint8(cooldownsCount);
9469
9470 uint32 curTime = GameTime::GetGameTimeMS().count();
9472
9473 for (CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
9474 {
9475 uint16 category = itr->second.category;
9476 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9477
9478 data << uint32(itr->first); // spellid
9479 data << uint16(itr->second.category); // spell category
9480
9481 // send infinity cooldown in special format
9482 if (itr->second.end >= infTime)
9483 {
9484 data << uint32(1); // cooldown
9485 data << uint32(0x80000000); // category cooldown
9486 continue;
9487 }
9488
9489 data << uint32(category ? 0 : cooldown); // cooldown
9490 data << uint32(category ? cooldown : 0); // category cooldown
9491 }
9492
9493 GetSession()->SendPacket(&data);
9494}
@ PETSPELL_REMOVED
Definition: PetDefines.h:60
#define MAKE_UNIT_ACTION_BUTTON(A, T)
Definition: CharmInfo.h:32
CreatureSpellCooldowns m_CreatureSpellCooldowns
Definition: Creature.h:252
bool IsPermanentPetFor(Player *owner) const
Definition: Pet.cpp:2298
Milliseconds GetDuration() const
Definition: Pet.h:91
PetSpellMap m_spells
Definition: Pet.h:121

References CharmInfo::BuildActionBar(), CreatureTemplate::family, Unit::GetCharmInfo(), CharmInfo::GetCommandState(), Creature::GetCreatureTemplate(), Pet::GetDuration(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetPet(), Creature::GetReactState(), GetSession(), infinityCooldownDelayCheck, Pet::IsPermanentPetFor(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Pet::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_UNIT_ACTION_BAR_INDEX, PETSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_PET_SPELLS, and ByteBuffer::wpos().

Referenced by CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectLearnPetSpell(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), AuraEffect::HandleModPossessPet(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleRequestPetInfo(), Pet::learnSpell(), Pet::LoadPetFromDB(), Pet::resetTalents(), Unit::SetMinion(), and SummonPet().

◆ PossessSpellInitialize()

void Player::PossessSpellInitialize ( )
9497{
9498 Unit* charm = GetCharm();
9499 if (!charm)
9500 return;
9501
9502 CharmInfo* charmInfo = charm->GetCharmInfo();
9503
9504 if (!charmInfo)
9505 {
9506 LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm ({}) has no charminfo!", charm->GetGUID().ToString());
9507 return;
9508 }
9509
9510 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9511 data << charm->GetGUID();
9512 data << uint16(0);
9513 data << uint32(0);
9514 data << uint32(0);
9515
9516 charmInfo->BuildActionBar(&data);
9517
9518 data << uint8(0); // spells count
9519 data << uint8(0); // cooldowns count
9520
9521 GetSession()->SendPacket(&data);
9522}
Unit * GetCharm() const
Definition: Unit.cpp:10606

References CharmInfo::BuildActionBar(), Unit::GetCharm(), Unit::GetCharmInfo(), Object::GetGUID(), GetSession(), LOG_ERROR, MAX_UNIT_ACTION_BAR_INDEX, WorldSession::SendPacket(), SMSG_PET_SPELLS, and ObjectGuid::ToString().

Referenced by Unit::SetCharmedBy().

◆ PrepareCharmAISpells()

void Player::PrepareCharmAISpells ( )
15363{
15364 for (int i = 0; i < NUM_CAI_SPELLS; ++i)
15365 m_charmAISpells[i] = 0;
15366
15367 uint32 damage_type[4] = {0, 0, 0, 0};
15368 uint32 periodic_damage = 0;
15369
15370 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15371 {
15372 if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
15373 continue;
15374
15375 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
15376 if (!spellInfo)
15377 continue;
15378
15379 if (!spellInfo->SpellFamilyName || spellInfo->IsPassive() || spellInfo->NeedsComboPoints() || (spellInfo->Stances && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)))
15380 continue;
15381
15382 float cast = spellInfo->CalcCastTime() / 1000.0f;
15383 if (cast > 3.0f)
15384 continue;
15385
15386 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
15387 {
15388 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
15389 {
15390 int32 dmg = CalculateSpellDamage(this, spellInfo, i);
15391 uint8 offset = 0;
15392 if (cast)
15393 {
15394 dmg = dmg / cast;
15395 offset = 2;
15396 }
15397
15398 if ((int32)damage_type[offset] < dmg)
15399 {
15400 if (!m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] || !spellInfo->IsHighRankOf(sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])) || urand(0, 1))
15401 if (damage_type[1 + offset] < damage_type[offset])
15402 {
15404 damage_type[1 + offset] = damage_type[offset];
15405 }
15406
15407 m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] = spellInfo->Id;
15408 damage_type[offset] = dmg;
15409 }
15410 else if ((int32)damage_type[1 + offset] < dmg)
15411 {
15412 if (m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] && sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])->IsHighRankOf(spellInfo) && urand(0, 1))
15413 continue;
15414
15415 m_charmAISpells[SPELL_INSTANT_DAMAGE2 + offset] = spellInfo->Id;
15416 damage_type[1 + offset] = dmg;
15417 }
15418 break;
15419 }
15421 {
15422 m_charmAISpells[SPELL_T_CHARGE] = spellInfo->Id;
15423 break;
15424 }
15425 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED)
15426 {
15427 m_charmAISpells[SPELL_FAST_RUN] = spellInfo->Id;
15428 break;
15429 }
15430 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY)
15431 {
15432 m_charmAISpells[SPELL_IMMUNITY] = spellInfo->Id;
15433 break;
15434 }
15435 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
15436 {
15437 if( (int32)periodic_damage < CalculateSpellDamage(this, spellInfo, i) )
15438 {
15439 m_charmAISpells[SPELL_DOT_DAMAGE] = spellInfo->Id;
15440 break;
15441 }
15442 }
15443 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN)
15444 {
15445 m_charmAISpells[SPELL_T_STUN] = spellInfo->Id;
15446 break;
15447 }
15448 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT || spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_FEAR)
15449 {
15451 break;
15452 }
15453 }
15454 }
15455}
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
@ SPELL_ROOT_OR_FEAR
Definition: Player.h:915
@ SPELL_INSTANT_DAMAGE2
Definition: Player.h:917
@ SPELL_INSTANT_DAMAGE
Definition: Player.h:916
@ SPELL_T_CHARGE
Definition: Player.h:921
@ SPELL_DOT_DAMAGE
Definition: Player.h:920
@ SPELL_FAST_RUN
Definition: Player.h:923
@ SPELL_T_STUN
Definition: Player.h:914
@ SPELL_IMMUNITY
Definition: Player.h:922
@ SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT
Definition: SharedDefines.h:659
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14778
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:2580
bool NeedsComboPoints() const
Definition: SpellInfo.cpp:1265
uint32 CalcCastTime(Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2351

References SpellInfo::CalcCastTime(), Unit::CalculateSpellDamage(), SpellInfo::Effects, GetActiveSpec(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsHighRankOf(), SpellInfo::IsPassive(), m_charmAISpells, m_spells, MAX_SPELL_EFFECTS, SpellInfo::NeedsComboPoints(), NUM_CAI_SPELLS, PLAYERSPELL_REMOVED, SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_SCHOOL_IMMUNITY, SPELL_DOT_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_FAST_RUN, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_INSTANT_DAMAGE2, SPELL_ROOT_OR_FEAR, SPELL_T_CHARGE, SPELL_T_STUN, SpellInfo::SpellFamilyName, sSpellMgr, SpellInfo::Stances, and urand().

Referenced by LoadFromDB().

◆ PrepareGossipMenu()

void Player::PrepareGossipMenu ( WorldObject source,
uint32  menuId = 0,
bool  showQuests = false 
)

Find localizations from database.

Find localizations from database.

33{
35 menu->ClearMenus();
36
37 menu->GetGossipMenu().SetMenuId(menuId);
38
39 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
40
41 // if default menuId and no menu options exist for this, use options from default options
42 if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source))
43 menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0);
44
45 uint32 npcflags = 0;
46
47 if (source->GetTypeId() == TYPEID_UNIT)
48 {
49 npcflags = source->ToUnit()->GetNpcFlags();
50 if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER)
51 PrepareQuestMenu(source->GetGUID());
52 }
53 else if (source->GetTypeId() == TYPEID_GAMEOBJECT)
54 if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
55 PrepareQuestMenu(source->GetGUID());
56
57 for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
58 {
59 bool canTalk = true;
60 if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
61 continue;
62
63 if (Creature* creature = source->ToCreature())
64 {
65 if (!(itr->second.OptionNpcFlag & npcflags))
66 continue;
67
68 switch (itr->second.OptionType)
69 {
71 canTalk = false; // added in special mode
72 break;
74 if (!isDead())
75 canTalk = false;
76 break;
78 {
79 if (!creature->isVendorWithIconSpeak())
80 {
81 VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems();
82 if (!vendorItems || vendorItems->Empty())
83 {
84 LOG_ERROR("sql.sql", "Creature {} have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUID().ToString());
85 canTalk = false;
86 }
87 break;
88 }
89 break;
90 }
93 if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(GetLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
94 canTalk = false;
95 break;
97 if (!creature->isCanTrainingAndResetTalentsOf(this))
98 canTalk = false;
99 break;
101 if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
102 canTalk = false;
103 break;
105 if (GetSession()->SendLearnNewTaxiNode(creature))
106 return;
107 break;
109 if (!creature->isCanInteractWithBattleMaster(this, false))
110 canTalk = false;
111 break;
114 canTalk = false;
115 break;
117 canTalk = false;
118 break;
120 if (!creature->IsValidTrainerForPlayer(this))
121 {
122 canTalk = false;
123 }
124 break;
126 if (creature->isVendorWithIconSpeak())
127 {
128 VendorItemData const* vendorItems = creature->GetVendorItems();
129 if (!vendorItems || vendorItems->Empty())
130 {
131 canTalk = false;
132 }
133 }
134 break;
141 break; // no checks
143 if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second))
144 canTalk = false;
145 break;
146 default:
147 LOG_ERROR("sql.sql", "Creature entry {} has unknown OptionType {} for menu {}", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID);
148 canTalk = false;
149 break;
150 }
151 }
152 else if (GameObject* go = source->ToGameObject())
153 {
154 switch (itr->second.OptionType)
155 {
157 if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER)
158 canTalk = false;
159 break;
160 default:
161 canTalk = false;
162 break;
163 }
164 }
165
166 if (canTalk)
167 {
168 // using gossip_menu_option texts by default
169 std::string strOptionText = itr->second.OptionText;
170 std::string strBoxText = itr->second.BoxText;
171 // search in broadcast_text and broadcast_text_locale
172 BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
173 BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
175
176 if (optionBroadcastText)
177 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? optionBroadcastText->MaleText : optionBroadcastText->FemaleText, locale, strOptionText);
178
179 if (boxBroadcastText)
180 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? boxBroadcastText->MaleText : boxBroadcastText->FemaleText, locale, strBoxText);
181
182 // if the language is not default and the texts weren't found, maybe they're in gossip_menu_option_locale table
183 if (locale != DEFAULT_LOCALE)
184 {
185 if (!optionBroadcastText)
186 {
188 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
189 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
190 }
191
192 if (!boxBroadcastText)
193 {
195 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
196 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
197 }
198 }
199
200 menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
201 menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
202 }
203 }
204
205 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && npcflags & UNIT_NPC_FLAG_FLIGHTMASTER)
207}
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition: ObjectMgr.h:634
@ GOSSIP_ICON_INTERACT_1
Definition: GossipDef.h:64
@ HUNTER_PET
Definition: PetDefines.h:32
@ LANG_TOGGLE_INSTANT_FLIGHT
Definition: Language.h:1314
@ GAMEOBJECT_TYPE_GOOBER
Definition: SharedDefines.h:1570
@ TRAINER_TYPE_PETS
Definition: SharedDefines.h:2620
LocaleConstant
Definition: Common.h:64
#define DEFAULT_LOCALE
Definition: Common.h:78
AC_GAME_API char const * GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition: ChatCommandHelpers.cpp:28
Definition: CreatureData.h:352
void SetMenuId(uint32 menu_id)
Definition: GossipDef.h:170
void AddMenuItem(int32 menuItemId, uint8 icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition: GossipDef.cpp:41
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition: GossipDef.cpp:136
void ClearMenus()
Definition: GossipDef.cpp:187
GameobjectTypes GetGoType() const
Definition: GameObject.h:204
Definition: ObjectMgr.h:435
std::vector< std::string > FemaleText
Definition: ObjectMgr.h:445
std::vector< std::string > MaleText
Definition: ObjectMgr.h:444
static std::string_view GetLocaleString(std::vector< std::string > const &data, std::size_t locale)
Definition: ObjectMgr.h:1405

References GossipMenu::AddGossipMenuItemData(), GossipMenu::AddMenuItem(), CLASS_CONTEXT_PET, CLASS_HUNTER, PlayerMenu::ClearMenus(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, DEFAULT_LOCALE, VendorItemData::Empty(), BroadcastText::FemaleText, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GENDER_MALE, GetDefaultGossipMenuForSource(), Unit::getGender(), PlayerMenu::GetGossipMenu(), GameObject::GetGoType(), Object::GetGUID(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Unit::GetNpcFlags(), GetPet(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetSpecsCount(), Object::GetTypeId(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_ICON_INTERACT_1, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, HUNTER_PET, IsClass(), Unit::isDead(), LANG_TOGGLE_INSTANT_FLIGHT, LOG_ERROR, m_spells, MAKE_PAIR32(), BroadcastText::MaleText, PlayerTalkClass, PrepareQuestMenu(), sConditionMgr, GossipMenu::SetMenuId(), sObjectMgr, sOutdoorPvPMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), Object::ToUnit(), TRAINER_TYPE_PETS, TYPEID_GAMEOBJECT, TYPEID_UNIT, UNIT_NPC_FLAG_FLIGHTMASTER, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), brann_bronzebeard::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ PrepareQuestMenu()

void Player::PrepareQuestMenu ( ObjectGuid  guid)
40{
41 QuestRelationBounds objectQR;
42 QuestRelationBounds objectQIR;
43
44 // pets also can have quests
46 if (creature)
47 {
48 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
49 objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
50 }
51 else
52 {
53 //we should obtain map pointer from GetMap() in 99% of cases. Special case
54 //only for quests which cast teleport spells on player
56 ASSERT(_map);
57 GameObject* pGameObject = _map->GetGameObject(guid);
58 if (pGameObject)
59 {
60 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
61 objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry());
62 }
63 else
64 return;
65 }
66
68 qm.ClearMenu();
69
70 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
71 {
72 uint32 quest_id = i->second;
73 QuestStatus status = GetQuestStatus(quest_id);
74 if (status == QUEST_STATUS_COMPLETE)
75 qm.AddMenuItem(quest_id, 4);
76 else if (status == QUEST_STATUS_INCOMPLETE)
77 qm.AddMenuItem(quest_id, 4);
78 //else if (status == QUEST_STATUS_AVAILABLE)
79 // qm.AddMenuItem(quest_id, 2);
80 }
81
82 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
83 {
84 uint32 quest_id = i->second;
85 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
86 if (!quest)
87 continue;
88
89 if (!CanTakeQuest(quest, false))
90 continue;
91
92 if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()))
93 qm.AddMenuItem(quest_id, 0);
94 else if (quest->IsAutoComplete())
95 qm.AddMenuItem(quest_id, 4);
96 else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
97 qm.AddMenuItem(quest_id, 2);
98 }
99}
Definition: GossipDef.h:228
void ClearMenu()
Definition: GossipDef.cpp:310
void AddMenuItem(uint32 QuestId, uint8 Icon)
Definition: GossipDef.cpp:286
QuestMenu & GetQuestMenu()
Definition: GossipDef.h:264

References QuestMenu::AddMenuItem(), ASSERT, CanTakeQuest(), QuestMenu::ClearMenu(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), PlayerMenu::GetQuestMenu(), GetQuestStatus(), Quest::IsAutoComplete(), Quest::IsDaily(), Object::IsInWorld(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), PlayerTalkClass, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, sMapMgr, and sObjectMgr.

Referenced by npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), npc_sayge::OnGossipHello(), go_fel_crystalforge::OnGossipHello(), go_bashir_crystalforge::OnGossipHello(), OnGossipSelect(), PrepareGossipMenu(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ PrettyPrintRequirementsAchievementsList()

void Player::PrettyPrintRequirementsAchievementsList ( const std::vector< const ProgressionRequirement * > &  missingAchievements) const
6650{
6652 for (const ProgressionRequirement* missingReq : missingAchievements)
6653 {
6654 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id);
6655 if (!achievementEntry)
6656 {
6657 continue;
6658 }
6659
6660 std::string name = achievementEntry->name[sObjectMgr->GetDBCLocaleIndex()];
6661
6662 std::stringstream stream;
6663 stream << "|cffff7c0a|Hachievement:";
6664 stream << missingReq->id;
6665 stream << ":";
6666 stream << GetGUID().ToString();
6667 stream << ":0:0:0:0:0:0:0:0|h[";
6668 stream << name;
6669 stream << "]|h|r";
6670
6671 if (missingReq->note.empty())
6672 {
6673 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6674 }
6675 else
6676 {
6677 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6678 }
6679 }
6680}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
@ LANG_ACCESS_REQUIREMENT_NOTE
Definition: Language.h:845
Definition: Player.h:932
Definition: DBCStructure.h:40
std::array< char const *, 16 > name
Definition: DBCStructure.h:45

References Object::GetGUID(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), LANG_ACCESS_REQUIREMENT_NOTE, AchievementEntry::name, ChatHandler::PSendSysMessage(), sAchievementStore, sObjectMgr, and ObjectGuid::ToString().

Referenced by Satisfy().

◆ PrettyPrintRequirementsItemsList()

void Player::PrettyPrintRequirementsItemsList ( const std::vector< const ProgressionRequirement * > &  missingItems) const
6683{
6685 for (const ProgressionRequirement* missingReq : missingItems)
6686 {
6687 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id);
6688 if (!itemTemplate)
6689 {
6690 continue;
6691 }
6692
6693 //Get the localised name
6694 std::string name = itemTemplate->Name1;
6695 if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
6696 {
6697 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6698 }
6699
6700 std::stringstream stream;
6701 stream << "|c";
6702 stream << std::hex << ItemQualityColors[itemTemplate->Quality] << std::dec;
6703 stream << "|Hitem:";
6704 stream << itemTemplate->ItemId;
6705 stream << ":0:0:0:0:0:0:0:0:0|h[";
6706 stream << name;
6707 stream << "]|h|r";
6708
6709 if (missingReq->note.empty())
6710 {
6711 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6712 }
6713 else
6714 {
6715 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6716 }
6717 }
6718}
const uint32 ItemQualityColors[MAX_ITEM_QUALITY]
Definition: SharedDefines.h:353
std::string Name1
Definition: ItemTemplate.h:624
Definition: ItemTemplate.h:838

References ObjectMgr::GetLocaleString(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), ItemTemplate::ItemId, ItemQualityColors, LANG_ACCESS_REQUIREMENT_NOTE, ItemTemplate::Name1, ChatHandler::PSendSysMessage(), ItemTemplate::Quality, and sObjectMgr.

Referenced by Satisfy().

◆ PrettyPrintRequirementsQuestList()

void Player::PrettyPrintRequirementsQuestList ( const std::vector< const ProgressionRequirement * > &  missingQuests) const
6613{
6615 for (const ProgressionRequirement* missingReq : missingQuests)
6616 {
6617 Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id);
6618 if (!questTemplate)
6619 {
6620 continue;
6621 }
6622
6623 std::string questTitle = questTemplate->GetTitle();
6624 if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplate->GetQuestId()))
6625 {
6626 ObjectMgr::GetLocaleString(questLocale->Title, loc_idx, questTitle);
6627 }
6628
6629 std::stringstream stream;
6630 stream << "|cffff7c0a|Hquest:";
6631 stream << questTemplate->GetQuestId();
6632 stream << ":";
6633 stream << questTemplate->GetQuestLevel();
6634 stream << "|h[";
6635 stream << questTitle;
6636 stream << "]|h|r";
6637
6638 if (missingReq->note.empty())
6639 {
6640 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6641 }
6642 else
6643 {
6644 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6645 }
6646 }
6647}
Definition: QuestDef.h:182
int32 GetQuestLevel() const
Definition: QuestDef.h:232
std::string const & GetTitle() const
Definition: QuestDef.h:260

References ObjectMgr::GetLocaleString(), Quest::GetQuestId(), Quest::GetQuestLevel(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LANG_ACCESS_REQUIREMENT_NOTE, ChatHandler::PSendSysMessage(), and sObjectMgr.

Referenced by Satisfy().

◆ ProcessDelayedOperations()

void Player::ProcessDelayedOperations ( )
1614{
1615 if (m_DelayedOperations == 0)
1616 return;
1617
1619 {
1620 ResurrectPlayer(0.0f, false);
1621
1624 else
1625 SetFullHealth();
1626
1629 else
1631
1632 SetPower(POWER_RAGE, 0);
1634
1636 }
1637
1639 SaveToDB(false, false);
1640
1642 {
1643 Aura* aura = GetAura(26013);
1644 if (!aura || aura->GetDuration() <= 900000)
1645 CastSpell(this, 26013, true);
1646 }
1647
1649 {
1651 {
1652 // xinef: remove shapeshift auras
1654 {
1656 }
1659 }
1660 }
1661
1663 {
1665 {
1670 }
1671 }
1672
1674 {
1675 if (Group* g = GetGroup())
1676 g->SendUpdateToPlayer(GetGUID());
1677 }
1678
1680 {
1681 if (Vehicle* vehicle = GetVehicle())
1682 {
1683 SeatMap::iterator itr = vehicle->GetSeatIteratorForPassenger(this);
1684 if (itr != vehicle->Seats.end())
1685 if (Unit* base = vehicle->GetBase())
1686 {
1687 ExitVehicle();
1688 base->HandleSpellClick(this, itr->first);
1689 }
1690 }
1691 }
1692
1693 //we have executed ALL delayed ops, so clear the flag
1695}
@ DELAYED_BG_GROUP_RESTORE
Flag to restore group state after teleport from BG.
Definition: Player.h:907
@ DELAYED_SAVE_PLAYER
Definition: Player.h:902
@ DELAYED_BG_MOUNT_RESTORE
Flag to restore mount state after teleport from BG.
Definition: Player.h:905
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:908
@ DELAYED_BG_TAXI_RESTORE
Flag to restore taxi state after teleport from BG.
Definition: Player.h:906
@ DELAYED_SPELL_CAST_DESERTER
Definition: Player.h:904
@ DELAYED_RESURRECT_PLAYER
Definition: Player.h:903
void SaveToDB(bool create, bool logout)
Definition: PlayerStorage.cpp:7064
uint32 m_resurrectMana
Definition: Player.h:2806
void ContinueTaxiFlight()
Definition: Player.cpp:10397
uint32 m_resurrectHealth
Definition: Player.h:2806
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18780
Definition: Vehicle.h:28

References Unit::AddAura(), PlayerTaxi::AddTaxiDestination(), Unit::CastSpell(), EntryPointData::ClearTaxiPath(), ContinueTaxiFlight(), DELAYED_BG_GROUP_RESTORE, DELAYED_BG_MOUNT_RESTORE, DELAYED_BG_TAXI_RESTORE, DELAYED_RESURRECT_PLAYER, DELAYED_SAVE_PLAYER, DELAYED_SPELL_CAST_DESERTER, DELAYED_VEHICLE_TELEPORT, Unit::ExitVehicle(), Unit::GetAura(), Aura::GetDuration(), GetGroup(), Object::GetGUID(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetVehicle(), EntryPointData::HasTaxiPath(), Unit::IsInDisallowedMountForm(), m_DelayedOperations, m_entryPointData, m_resurrectHealth, m_resurrectMana, m_taxi, EntryPointData::mountSpell, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasByType(), ResurrectPlayer(), SaveToDB(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), SPELL_AURA_MOD_SHAPESHIFT, and EntryPointData::taxiPath.

Referenced by WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ProcessTerrainStatusUpdate()

void Player::ProcessTerrainStatusUpdate ( )
overridevirtual

Reimplemented from Unit.

2202{
2203 // process liquid auras using generic unit code
2205
2206 LiquidData const& liquidData = GetLiquidData();
2207
2208 // player specific logic for mirror timers
2209 if (liquidData.Status != LIQUID_MAP_NO_WATER)
2210 {
2211 // Breath bar state (under water in any liquid type)
2212 if ((liquidData.Flags & MAP_ALL_LIQUIDS) != 0)
2213 {
2214 if ((liquidData.Status & LIQUID_MAP_UNDER_WATER) != 0)
2216 else
2217 m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
2218 }
2219
2220 // Fatigue bar state (if not on flight path or transport)
2221 if ((liquidData.Flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
2222 {
2223 // Exclude also uncontrollable vehicles
2224 Vehicle* vehicle = GetVehicle();
2225 VehicleSeatEntry const* vehicleSeat = vehicle ? vehicle->GetSeatForPassenger(this) : nullptr;
2226 if (!vehicleSeat || vehicleSeat->CanControl())
2228 else
2229 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2230 }
2231 else
2232 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2233
2234 // Lava state (any contact)
2235 if (liquidData.Flags & MAP_LIQUID_TYPE_MAGMA)
2236 {
2237 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2239 else
2240 m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
2241 }
2242
2243 // Slime state (any contact)
2244 if (liquidData.Flags & MAP_LIQUID_TYPE_SLIME)
2245 {
2246 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2248 else
2249 m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
2250 }
2251 }
2252 else
2254}
#define MAP_LIQUID_TYPE_MAGMA
Definition: Map.h:157
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:148
@ LIQUID_MAP_NO_WATER
Definition: Map.h:144
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:152
#define MAP_LIQUID_TYPE_DARK_WATER
Definition: Map.h:162
#define MAP_LIQUID_TYPE_SLIME
Definition: Map.h:158
#define MAP_ALL_LIQUIDS
Definition: Map.h:160
@ UNDERWATER_INSLIME
Definition: Player.h:103
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3174
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4225
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
Definition: Vehicle.cpp:580
Definition: Map.h:171
uint32 Flags
Definition: Map.h:175
LiquidStatus Status
Definition: Map.h:178
Definition: DBCStructure.h:2064
bool CanControl() const
Definition: DBCStructure.h:2127

References VehicleSeatEntry::CanControl(), LiquidData::Flags, WorldObject::GetLiquidData(), Vehicle::GetSeatForPassenger(), WorldObject::GetTransport(), Unit::GetVehicle(), Unit::IsInFlight(), LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, m_MirrorTimerFlags, MAP_ALL_LIQUIDS, MAP_LIQUID_STATUS_IN_CONTACT, MAP_LIQUID_TYPE_DARK_WATER, MAP_LIQUID_TYPE_MAGMA, MAP_LIQUID_TYPE_SLIME, Unit::ProcessTerrainStatusUpdate(), LiquidData::Status, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INSLIME, and UNDERWATER_INWATER.

◆ ProhibitSpellSchool()

void Player::ProhibitSpellSchool ( SpellSchoolMask  idSchoolMask,
uint32  unTimeMs 
)
overridevirtual

Reimplemented from Unit.

10493{
10494 PacketCooldowns cooldowns;
10495 WorldPacket data;
10496
10497 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
10498 {
10499 if (itr->second->State == PLAYERSPELL_REMOVED)
10500 continue;
10501 uint32 unSpellId = itr->first;
10502 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(unSpellId);
10503
10504 // Not send cooldown for this spells
10505 if (spellInfo->IsCooldownStartedOnEvent())
10506 continue;
10507
10509 continue;
10510
10511 if ((idSchoolMask & spellInfo->GetSchoolMask()) && GetSpellCooldownDelay(unSpellId) < unTimeMs)
10512 {
10513 cooldowns[unSpellId] = unTimeMs;
10514 AddSpellCooldown(unSpellId, 0, unTimeMs, true);
10515 }
10516 }
10517
10518 if (!cooldowns.empty())
10519 {
10521 GetSession()->SendPacket(&data);
10522 }
10523}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition: SharedDefines.h:1554
uint32 GetSpellCooldownDelay(uint32 spell_id) const
Definition: Player.cpp:16294
uint32 PreventionType
Definition: SpellInfo.h:390
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1211
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1986

References AddSpellCooldown(), Unit::BuildCooldownPacket(), SpellInfo::GetSchoolMask(), GetSession(), GetSpellCooldownDelay(), SpellInfo::IsCooldownStartedOnEvent(), m_spells, PLAYERSPELL_REMOVED, SpellInfo::PreventionType, WorldSession::SendPacket(), SPELL_COOLDOWN_FLAG_NONE, SPELL_PREVENTION_TYPE_SILENCE, and sSpellMgr.

◆ QuickEquipItem()

void Player::QuickEquipItem ( uint16  pos,
Item pItem 
)
2851{
2852 if (pItem)
2853 {
2855 AddItemDurations(pItem);
2856
2857 uint8 slot = pos & 255;
2858 VisualizeItem(slot, pItem);
2859
2860 if (IsInWorld())
2861 {
2862 pItem->AddToWorld();
2863 pItem->SendUpdateToPlayer(this);
2864 }
2865
2868
2869 sScriptMgr->OnEquip(this, pItem, (pos >> 8), slot, true);
2870 }
2871}

References ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), AddItemDurations(), Object::AddToWorld(), Object::GetEntry(), Object::IsInWorld(), Object::SendUpdateToPlayer(), sScriptMgr, UpdateAchievementCriteria(), and VisualizeItem().

Referenced by _LoadInventory().

◆ RecalculateRating()

void Player::RecalculateRating ( CombatRating  cr)
inline
1938{ ApplyRatingMod(cr, 0, true);}

References ApplyRatingMod().

Referenced by DestroyItem(), EquipItem(), RemoveItem(), and UpdateAllStats().

◆ RefundItem()

void Player::RefundItem ( Item item)
private

Already checked before

15541{
15542 if (!item->IsRefundable())
15543 {
15544 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15545 return;
15546 }
15547
15548 if (item->IsRefundExpired()) // item refund has expired
15549 {
15550 item->SetNotRefundable(this);
15552 data << item->GetGUID(); // Guid
15553 data << uint32(10); // Error!
15554 GetSession()->SendPacket(&data);
15555 return;
15556 }
15557
15558 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15559 {
15560 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15561 item->SetNotRefundable(this);
15562 return;
15563 }
15564
15565 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15566 if (!iece)
15567 {
15568 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15569 return;
15570 }
15571
15572 bool store_error = false;
15573 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15574 {
15575 uint32 count = iece->reqitemcount[i];
15576 uint32 itemid = iece->reqitem[i];
15577
15578 if (count && itemid)
15579 {
15580 ItemPosCountVec dest;
15581 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15582 if (msg != EQUIP_ERR_OK)
15583 {
15584 store_error = true;
15585 break;
15586 }
15587 }
15588 }
15589
15590 if (store_error)
15591 {
15593 data << item->GetGUID(); // Guid
15594 data << uint32(10); // Error!
15595 GetSession()->SendPacket(&data);
15596 return;
15597 }
15598
15599 WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
15600 data << item->GetGUID(); // item guid
15601 data << uint32(0); // 0, or error code
15602 data << uint32(item->GetPaidMoney()); // money cost
15603 data << uint32(iece->reqhonorpoints); // honor point cost
15604 data << uint32(iece->reqarenapoints); // arena point cost
15605 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15606 {
15607 data << uint32(iece->reqitem[i]);
15608 data << uint32(iece->reqitemcount[i]);
15609 }
15610 GetSession()->SendPacket(&data);
15611
15612 uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
15613
15614 // Save all relevant data to DB to prevent desynchronisation exploits
15615 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15616
15617 // Delete any references to the refund data
15618 item->SetNotRefundable(this, true, &trans);
15619
15620 // Destroy item
15621 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
15622
15623 // Grant back extendedcost items
15624 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15625 {
15626 uint32 count = iece->reqitemcount[i];
15627 uint32 itemid = iece->reqitem[i];
15628 if (count && itemid)
15629 {
15630 ItemPosCountVec dest;
15631 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15632 ASSERT(msg == EQUIP_ERR_OK);
15633 Item* it = StoreNewItem(dest, itemid, true);
15634 SendNewItem(it, count, true, false, true);
15635 }
15636 }
15637
15638 // Grant back money
15639 if (moneyRefund)
15640 ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
15641
15642 // Grant back Honor points
15643 if (uint32 honorRefund = iece->reqhonorpoints)
15644 ModifyHonorPoints(honorRefund, trans);
15645
15646 // Grant back Arena points
15647 if (uint32 arenaRefund = iece->reqarenapoints)
15648 ModifyArenaPoints(arenaRefund, trans);
15649
15651
15652 CharacterDatabase.CommitTransaction(trans);
15653}
@ SMSG_ITEM_REFUND_RESULT
Definition: Opcodes.h:1235
uint32 GetPaidExtendedCost()
Definition: Item.h:349
uint32 GetPaidMoney()
Definition: Item.h:348
ObjectGuid::LowType GetRefundRecipient()
Definition: Item.h:347
bool IsRefundExpired()
Definition: Item.cpp:1254
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7135

References ASSERT, CanStoreNewItem(), CharacterDatabase, DestroyItem(), EQUIP_ERR_OK, Item::GetBagSlot(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetRefundRecipient(), GetSession(), Item::GetSlot(), Item::IsRefundable(), Item::IsRefundExpired(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, SaveInventoryAndGoldToDB(), SendNewItem(), WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_RESULT, and StoreNewItem().

Referenced by WorldSession::HandleItemRefund().

◆ Regenerate()

void Player::Regenerate ( Powers  power)
Todo:
: possible use of miscvalueb instead of amount
1835{
1836 uint32 maxValue = GetMaxPower(power);
1837 if (!maxValue)
1838 return;
1839
1840 //If .cheat power is on always have the max power
1842 {
1843 if (m_regenTimerCount >= 2000)
1844 {
1845 //Set the value to 0 first then set it to max to force resend of packet as for range clients keeps removing rage
1846 if (power == POWER_RAGE || power == POWER_RUNIC_POWER)
1847 {
1848 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, 0);
1849 }
1850
1851 SetPower(power, maxValue);
1852 return;
1853 }
1854 }
1855
1856 uint32 curValue = GetPower(power);
1857
1860 return;
1861
1862 float addvalue = 0.0f;
1863
1864 switch (power)
1865 {
1866 case POWER_MANA:
1867 {
1868 bool recentCast = IsUnderLastManaUseEffect();
1869 float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
1870
1871 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1872 ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
1873
1874 if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
1875 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1876 else
1877 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1878 }
1879 break;
1880 case POWER_RAGE: // Regenerate rage
1881 {
1883 {
1884 float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
1885 addvalue += -20 * RageDecreaseRate; // 2 rage by tick (= 2 seconds => 1 rage/sec)
1886 }
1887 }
1888 break;
1889 case POWER_ENERGY: // Regenerate energy (rogue)
1890 addvalue += 0.01f * m_regenTimer * sWorld->getRate(RATE_POWER_ENERGY);
1891 break;
1892 case POWER_RUNIC_POWER:
1893 {
1895 {
1896 float RunicPowerDecreaseRate = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);
1897 addvalue += -30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
1898 }
1899 }
1900 break;
1901 case POWER_RUNE:
1902 case POWER_FOCUS:
1903 case POWER_HAPPINESS:
1904 break;
1905 case POWER_HEALTH:
1906 return;
1907 default:
1908 break;
1909 }
1910
1911 // Mana regen calculated in Player::UpdateManaRegen()
1912 if (power != POWER_MANA)
1913 {
1915 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
1916 if (Powers((*i)->GetMiscValue()) == power)
1917 AddPct(addvalue, (*i)->GetAmount());
1918
1919 // Butchery requires combat for this effect
1920 if (power != POWER_RUNIC_POWER || IsInCombat())
1922 }
1923
1924 if (addvalue < 0.0f)
1925 {
1926 if (curValue == 0)
1927 return;
1928 }
1929 else if (addvalue > 0.0f)
1930 {
1931 if (curValue == maxValue)
1932 return;
1933 }
1934 else
1935 return;
1936
1937 addvalue += m_powerFraction[power];
1938 uint32 integerValue = uint32(std::fabs(addvalue));
1939
1940 bool forcedUpdate = false;
1941 if (addvalue < 0.0f)
1942 {
1943 if (curValue > integerValue)
1944 {
1945 curValue -= integerValue;
1946 m_powerFraction[power] = addvalue + integerValue;
1947 }
1948 else
1949 {
1950 curValue = 0;
1951 m_powerFraction[power] = 0;
1952 forcedUpdate = true;
1953 }
1954 }
1955 else
1956 {
1957 curValue += integerValue;
1958
1959 if (curValue >= maxValue)
1960 {
1961 curValue = maxValue;
1962 m_powerFraction[power] = 0;
1963 forcedUpdate = true;
1964 }
1965 else
1966 {
1967 m_powerFraction[power] = addvalue - integerValue;
1968 }
1969 }
1970
1971 if (m_regenTimerCount >= 2000 || forcedUpdate)
1972 {
1973 SetPower(power, curValue, true, true);
1974 }
1975 else
1976 {
1977 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
1978 }
1979}
@ SPELL_AURA_INTERRUPT_REGEN
Definition: SpellAuraDefines.h:157
@ SPELL_AURA_MOD_POWER_REGEN
Definition: SpellAuraDefines.h:148
@ SPELL_AURA_PREVENT_REGENERATE_POWER
Definition: SpellAuraDefines.h:357
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition: UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition: UpdateFields.h:112
@ CHEAT_POWER
Definition: Player.h:1001
@ CONFIG_LOW_LEVEL_REGEN_BOOST
Definition: IWorld.h:184
@ RATE_POWER_RAGE_LOSS
Definition: IWorld.h:434
@ RATE_POWER_RUNICPOWER_LOSS
Definition: IWorld.h:436
@ RATE_POWER_ENERGY
Definition: IWorld.h:438
@ RATE_POWER_MANA
Definition: IWorld.h:432
@ POWER_HEALTH
Definition: SharedDefines.h:278
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
bool IsUnderLastManaUseEffect() const
Definition: Unit.cpp:17171
bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const
Definition: Unit.cpp:5680

References AddPct(), CHEAT_POWER, CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), GetCommandStatus(), Object::GetFloatValue(), Unit::GetLevel(), Unit::GetMaxPower(), Unit::GetPower(), Unit::GetTotalAuraModifierByMiscValue(), Unit::HasAuraType(), Unit::HasAuraTypeWithMiscvalue(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsUnderLastManaUseEffect(), m_powerFraction, Unit::m_regenTimer, m_regenTimerCount, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, RATE_POWER_ENERGY, RATE_POWER_MANA, RATE_POWER_RAGE_LOSS, RATE_POWER_RUNICPOWER_LOSS, Unit::SetPower(), SPELL_AURA_INTERRUPT_REGEN, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, sWorld, UNIT_FIELD_POWER1, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, and Object::UpdateUInt32Value().

Referenced by RegenerateAll().

◆ RegenerateAll()

void Player::RegenerateAll ( )
1752{
1753 //if (m_regenTimer <= 500)
1754 // return;
1755
1758
1760
1762
1763 // Runes act as cooldowns, and they don't need to send any data
1765 for (uint8 i = 0; i < MAX_RUNES; ++i)
1766 {
1767 // xinef: implement grace
1768 if (int32 cd = GetRuneCooldown(i))
1769 {
1770 SetRuneCooldown(i, (cd > m_regenTimer) ? cd - m_regenTimer : 0);
1771 // start grace counter, player must be in combat and rune has to go off cooldown
1772 if (IsInCombat() && cd <= m_regenTimer)
1773 SetGracePeriod(i, m_regenTimer - cd + 1); // added 1 because m_regenTimer-cd can be equal 0
1774 }
1775 // xinef: if grace is started, increase it but no more than cap
1776 else if (uint32 grace = GetGracePeriod(i))
1777 {
1778 if (grace < RUNE_GRACE_PERIOD)
1779 SetGracePeriod(i, std::min<uint32>(grace + m_regenTimer, RUNE_GRACE_PERIOD));
1780 }
1781 }
1782
1783 if (m_regenTimerCount >= 2000)
1784 {
1785 // Not in combat or they have regeneration
1789 {
1791 }
1792
1796
1797 m_regenTimerCount -= 2000;
1798 }
1799
1800 m_regenTimer = 0;
1801
1802 // Handles the emotes for drinking and eating.
1803 // According to sniffs there is a background timer going on that repeats independed from the time window where the aura applies.
1804 // That's why we dont need to reset the timer on apply. In sniffs I have seen that the first call for the spell visual is totally random, then after
1805 // 5 seconds over and over again which confirms my theory that we have a independed timer.
1806 if (m_foodEmoteTimerCount >= 5000)
1807 {
1808 std::vector<AuraEffect*> auraList;
1811
1812 auraList.reserve(ModRegenAuras.size() + ModPowerRegenAuras.size());
1813 auraList.insert(auraList.end(), ModRegenAuras.begin(), ModRegenAuras.end());
1814 auraList.insert(auraList.end(), ModPowerRegenAuras.begin(), ModPowerRegenAuras.end());
1815
1816 for (auto itr = auraList.begin(); itr != auraList.end(); ++itr)
1817 {
1818 // Food emote comes above drinking emote if we have to decide (mage regen food for example)
1819 if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1820 {
1822 break;
1823 }
1824 else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1825 {
1827 break;
1828 }
1829 }
1830 m_foodEmoteTimerCount -= 5000;
1831 }
1832}
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:62
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition: SpellAuraDefines.h:179
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition: SpellAuraDefines.h:224
@ SPELL_AURA_MOD_REGEN
Definition: SpellAuraDefines.h:147
@ RUNE_GRACE_PERIOD
Definition: Player.h:403
@ SPELL_VISUAL_KIT_DRINK
Definition: SharedDefines.h:350
@ SPELL_VISUAL_KIT_FOOD
Definition: SharedDefines.h:349
void Regenerate(Powers power)
Definition: Player.cpp:1834
void RegenerateHealth()
Definition: Player.cpp:1981
bool IsPolymorphed() const
Definition: Unit.cpp:16669
void SendPlaySpellVisual(uint32 id)
Definition: Unit.cpp:18828

References AURA_INTERRUPT_FLAG_NOT_SEATED, CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, Unit::GetAuraEffectsByType(), GetGracePeriod(), GetRuneCooldown(), Unit::HasAuraType(), IsClass(), Unit::IsInCombat(), Unit::IsPolymorphed(), m_baseHealthRegen, m_foodEmoteTimerCount, Unit::m_regenTimer, m_regenTimerCount, MAX_RUNES, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Regenerate(), RegenerateHealth(), RUNE_GRACE_PERIOD, Unit::SendPlaySpellVisual(), SetGracePeriod(), SetRuneCooldown(), SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, SPELL_VISUAL_KIT_DRINK, and SPELL_VISUAL_KIT_FOOD.

Referenced by Update().

◆ RegenerateHealth()

void Player::RegenerateHealth ( )
1982{
1983 uint32 curValue = GetHealth();
1984 uint32 maxValue = GetMaxHealth();
1985
1986 if (curValue >= maxValue)
1987 return;
1988
1989 float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
1990
1991 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1992 HealthIncreaseRate = sWorld->getRate(RATE_HEALTH) * (2.066f - (GetLevel() * 0.066f));
1993
1994 float addvalue = 0.0f;
1995
1996 // polymorphed case
1997 if (IsPolymorphed())
1998 addvalue = (float)GetMaxHealth() / 3;
1999 // normal regen case (maybe partly in combat case)
2001 {
2002 addvalue = OCTRegenHPPerSpirit() * HealthIncreaseRate;
2003
2004 if (!IsStandState())
2005 {
2006 addvalue *= 1.33f;
2007 }
2008
2010 for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
2011 {
2012 AddPct(addvalue, (*i)->GetAmount());
2013 }
2014
2015 if (!IsInCombat())
2016 {
2018 }
2020 {
2022 }
2023 }
2024
2025 // always regeneration bonus (including combat)
2027 addvalue += m_baseHealthRegen / 2.5f;
2028
2029 if (addvalue < 0)
2030 addvalue = 0;
2031
2032 ModifyHealth(int32(addvalue));
2033}
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
Definition: SpellAuraDefines.h:151
@ RATE_HEALTH
Definition: IWorld.h:431
T ApplyPct(T &base, U pct)
Definition: Util.h:73
float OCTRegenHPPerSpirit()
Definition: Player.cpp:5160
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14020
bool IsStandState() const
Definition: Unit.cpp:16648

References AddPct(), ApplyPct(), CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), Unit::GetHealth(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetTotalAuraModifier(), Unit::HasAuraType(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsPolymorphed(), Unit::IsStandState(), m_baseHealthRegen, Unit::ModifyHealth(), OCTRegenHPPerSpirit(), RATE_HEALTH, SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_HEALTH_REGEN_PERCENT, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, and sWorld.

Referenced by RegenerateAll().

◆ removeActionButton()

void Player::removeActionButton ( uint8  button)
5581{
5582 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5583 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5584 return;
5585
5586 if (buttonItr->second.uState == ACTIONBUTTON_NEW)
5587 m_actionButtons.erase(buttonItr); // new and not saved
5588 else
5589 buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save
5590
5591 LOG_DEBUG("entities.player", "Action Button {} Removed from Player {}", button, GetGUID().ToString());
5592}

References ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, Object::GetGUID(), LOG_DEBUG, m_actionButtons, and Position::ToString().

Referenced by WorldSession::HandleSetActionButtonOpcode().

◆ RemoveActiveQuest()

void Player::RemoveActiveQuest ( uint32  questId,
bool  update = true 
)
1490{
1491 QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
1492 if (itr != m_QuestStatus.end())
1493 {
1494 m_QuestStatus.erase(itr);
1495 m_QuestStatusSave[questId] = false;
1496 }
1497
1498 if (update)
1499 SendQuestUpdate(questId);
1500
1501 // Xinef: area auras may change on quest remove!
1505}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), WorldObject::GetAreaId(), WorldObject::GetZoneId(), m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveAllSpellCooldown()

void Player::RemoveAllSpellCooldown ( )
3554{
3556 if (!m_spellCooldowns.empty())
3557 {
3558 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
3559 if (itr->second.end < infTime)
3560 SendClearCooldown(itr->first, this);
3561
3562 m_spellCooldowns.clear();
3563 }
3564}
void SendClearCooldown(uint32 spell_id, Unit *target)
Definition: Player.cpp:14599

References GameTime::GetGameTimeMS(), infinityCooldownDelayCheck, m_spellCooldowns, and SendClearCooldown().

Referenced by misc_commandscript::HandleCooldownCommand().

◆ RemoveAmmo()

◆ RemoveArenaEnchantments()

void Player::RemoveArenaEnchantments ( EnchantmentSlot  slot)
4241{
4242 // remove enchantments from equipped items first to clean up the m_enchantDuration list
4243 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4244 {
4245 next = itr;
4246 if (itr->slot == slot)
4247 {
4248 if (itr->item && itr->item->GetEnchantmentId(slot))
4249 {
4250 // Poisons and DK runes are enchants which are allowed on arenas
4251 if (sSpellMgr->IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
4252 {
4253 ++next;
4254 continue;
4255 }
4256 // remove from stats
4257 ApplyEnchantment(itr->item, slot, false, false);
4258 // remove visual
4259 itr->item->ClearEnchantment(slot);
4260 }
4261 // remove from update list
4262 next = m_enchantDuration.erase(itr);
4263 }
4264 else
4265 ++next;
4266 }
4267
4268 // Xinef: check arena allowed enchantments :)
4269 // remove enchants from inventory items
4270 // NOTE: no need to remove these from stats, since these aren't equipped
4271 // in inventory
4273 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4274 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4275 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4276 pItem->ClearEnchantment(slot);
4277
4278 // in inventory bags
4280 if (Bag* pBag = GetBagByPos(i))
4281 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4282 if (Item* pItem = pBag->GetItemByPos(j))
4283 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4284 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4285 pItem->ClearEnchantment(slot);
4286}

References ApplyEnchantment(), GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, m_enchantDuration, and sSpellMgr.

Referenced by Battleground::AddPlayer().

◆ RemoveArenaSpellCooldowns()

void Player::RemoveArenaSpellCooldowns ( bool  removeActivePetCooldowns = false)
3519{
3520 // remove cooldowns on spells that have < 10 min CD
3522 SpellCooldowns::iterator itr, next;
3523 for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
3524 {
3525 next = itr;
3526 ++next;
3527 SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first);
3528 if (!spellInfo)
3529 {
3530 continue;
3531 }
3532
3534 RemoveSpellCooldown(itr->first, true);
3535 else if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS && spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS && itr->second.end < infTime// xinef: dont remove active cooldowns - bugz
3536 && itr->second.maxduration < 10 * MINUTE * IN_MILLISECONDS) // xinef: dont clear cooldowns that have maxduration > 10 minutes (eg item cooldowns with no spell.dbc cooldown info)
3537 RemoveSpellCooldown(itr->first, true);
3538 }
3539
3540 // pet cooldowns
3541 if (removeActivePetCooldowns)
3542 if (Pet* pet = GetPet())
3543 {
3544 // notify player
3545 for (CreatureSpellCooldowns::const_iterator itr2 = pet->m_CreatureSpellCooldowns.begin(); itr2 != pet->m_CreatureSpellCooldowns.end(); ++itr2)
3546 SendClearCooldown(itr2->first, pet);
3547
3548 // actually clear cooldowns
3549 pet->m_CreatureSpellCooldowns.clear();
3550 }
3551}
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
Definition: SharedDefines.h:547
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3502

References SpellInfo::CategoryRecoveryTime, GameTime::GetGameTimeMS(), GetPet(), SpellInfo::HasAttribute(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, SpellInfo::RecoveryTime, RemoveSpellCooldown(), SendClearCooldown(), SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS, and sSpellMgr.

Referenced by TeleportTo().

◆ RemoveAtLoginFlag()

void Player::RemoveAtLoginFlag ( AtLoginFlags  flags,
bool  persist = false 
)
14585{
14586 m_atLoginFlags &= ~flags;
14587
14588 if (persist)
14589 {
14591
14592 stmt->SetData(0, uint16(flags));
14593 stmt->SetData(1, GetGUID().GetCounter());
14594
14595 CharacterDatabase.Execute(stmt);
14596 }
14597}
@ CHAR_UPD_REM_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:275

References CHAR_UPD_REM_AT_LOGIN_FLAG, CharacterDatabase, Object::GetGUID(), m_atLoginFlags, and PreparedStatementBase::SetData().

Referenced by WorldSession::HandlePlayerLoginFromDB(), LoadCorpse(), resetSpells(), Pet::resetTalents(), resetTalents(), and Pet::resetTalentsForAllPetsOf().

◆ RemoveBattlegroundQueueId()

void Player::RemoveBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12221{
12222 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12223 {
12224 if (_BgBattlegroundQueueID[i].bgQueueTypeId == val)
12225 {
12227 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12228 return;
12229 }
12230 }
12231}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BGQueueRemoveEvent::Execute(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::LogoutPlayer(), and Battleground::RemovePlayerAtLeave().

◆ RemoveCategoryCooldown()

void Player::RemoveCategoryCooldown ( uint32  cat)
3511{
3512 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
3513 if (i_scstore != sSpellsByCategoryStore.end())
3514 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
3515 RemoveSpellCooldown(i_scset->second, true);
3516}

References RemoveSpellCooldown(), and sSpellsByCategoryStore.

Referenced by spell_hun_readiness::HandleDummy(), spell_item_refocus::HandleDummy(), and Unit::HandleProcTriggerSpell().

◆ RemoveCorpse()

void Player::RemoveCorpse ( )
4615{
4616 if (GetCorpse())
4617 {
4619 }
4620
4621 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4622 Corpse::DeleteFromDB(GetGUID(), trans);
4623 CharacterDatabase.CommitTransaction(trans);
4624
4626}
void RemoveFromWorld() override
Definition: Corpse.cpp:52

References _corpseLocation, CharacterDatabase, Corpse::DeleteFromDB(), GetCorpse(), Object::GetGUID(), Corpse::RemoveFromWorld(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandleMoveWorldportAck().

◆ RemovedInsignia()

void Player::RemovedInsignia ( Player looterPlr)
7691{
7692 // Xinef: If player is not in battleground and not in wintergrasp
7694 return;
7695
7696 // If not released spirit, do it !
7697 if (m_deathTimer > 0)
7698 {
7699 m_deathTimer = 0;
7702 }
7703
7705
7706 // We have to convert player corpse to bones, not to be able to resurrect there
7707 // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
7708 Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true);
7709 if (!bones)
7710 return;
7711
7712 // Now we must make bones lootable, and send player loot
7714
7715 // We store the level of our player in the gold field
7716 // We retrieve this information at Player::SendLoot()
7717 bones->loot.gold = GetLevel();
7718 bones->lootRecipient = looterPlr;
7719 looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
7720}
@ AREA_WINTERGRASP
Definition: BattlefieldWG.h:125
@ CORPSE_FIELD_DYNAMIC_FLAGS
Definition: UpdateFields.h:428
@ LOOT_INSIGNIA
Definition: LootMgr.h:91
@ CORPSE_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3133
Player * lootRecipient
Definition: Corpse.h:78
Loot loot
Definition: Corpse.h:77
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition: Player.cpp:7729
void BuildPlayerRepop()
Definition: Player.cpp:4366
uint32 gold
Definition: LootMgr.h:322
Corpse * ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia=false)
Definition: Map.cpp:3628

References _corpseLocation, AREA_WINTERGRASP, BuildPlayerRepop(), Map::ConvertCorpseToBones(), CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, GetBattlegroundId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), WorldObject::GetZoneId(), Loot::gold, Corpse::loot, LOOT_INSIGNIA, Corpse::lootRecipient, m_deathTimer, RepopAtGraveyard(), SendLoot(), Object::SetFlag(), and WorldLocation::WorldRelocate().

Referenced by Spell::EffectSkinPlayerCorpse().

◆ RemoveEnchantmentDurations()

void Player::RemoveEnchantmentDurations ( Item item)
4215{
4216 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4217 {
4218 if (itr->item == item)
4219 {
4220 // save duration in item
4221 item->SetEnchantmentDuration(EnchantmentSlot(itr->slot), itr->leftduration, this);
4222 itr = m_enchantDuration.erase(itr);
4223 }
4224 else
4225 ++itr;
4226 }
4227}
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
Definition: Item.cpp:942

References m_enchantDuration, and Item::SetEnchantmentDuration().

Referenced by _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveEnchantmentDurationsReferences()

void Player::RemoveEnchantmentDurationsReferences ( Item item)
4230{
4231 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4232 {
4233 if (itr->item == item)
4234 itr = m_enchantDuration.erase(itr);
4235 else
4236 ++itr;
4237 }
4238}

References m_enchantDuration.

Referenced by _SaveInventory().

◆ RemoveFromBattlegroundOrBattlefieldRaid()

void Player::RemoveFromBattlegroundOrBattlefieldRaid ( )
13048{
13049 //remove existing reference
13050 m_group.unlink();
13051 if (Group* group = GetOriginalGroup())
13052 {
13053 m_group.link(group, this);
13055 }
13056 SetOriginalGroup(nullptr);
13057}
void unlink()
Definition: Reference.h:62
void link(TO *toObj, FROM *fromObj)
Definition: Reference.h:45
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:13059
Group * GetOriginalGroup()
Definition: Player.h:2459
uint8 GetOriginalSubGroup() const
Definition: Player.h:2461
void setSubGroup(uint8 pSubGroup)
Definition: GroupReference.h:39

References GetOriginalGroup(), GetOriginalSubGroup(), Reference< TO, FROM >::link(), m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::Disband(), and Group::RemoveMember().

◆ RemoveFromGroup() [1/2]

void Player::RemoveFromGroup ( Group group,
ObjectGuid  guid,
RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
static
2343{
2344 if (group)
2345 {
2346 group->RemoveMember(guid, method, kicker, reason);
2347 group = nullptr;
2348 }
2349}
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Group.cpp:548

References Group::RemoveMember().

Referenced by DeleteFromDB(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::LogoutPlayer(), and lfg::LFGMgr::UpdateBoot().

◆ RemoveFromGroup() [2/2]

void Player::RemoveFromGroup ( RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT)
inline
1865{ RemoveFromGroup(GetGroup(), GetGUID(), method); }

References GetGroup(), Object::GetGUID(), and RemoveFromGroup().

Referenced by RemoveFromGroup().

◆ RemoveFromWhisperWhiteList()

void Player::RemoveFromWhisperWhiteList ( ObjectGuid  guid)
inline
2537{ WhisperList.remove(guid); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ RemoveFromWorld()

void Player::RemoveFromWorld ( )
overridevirtual
  • Release charmed creatures, unsummon totems and remove pets/guardians
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be removed when logging out

Reimplemented from WorldObject.

1710{
1711 // cleanup
1712 if (IsInWorld())
1713 {
1718 ClearComboPoints(); // pussywizard: crashfix
1719 ClearComboPointHolders(); // pussywizard: crashfix
1720 if (ObjectGuid lguid = GetLootGUID()) // pussywizard: crashfix
1721 m_session->DoLootRelease(lguid);
1722 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1723 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1724 }
1725
1726 // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
1727 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1728 {
1729 if (m_items[i])
1731 }
1732
1733 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
1734 iter->second->RemoveFromWorld();
1735
1740
1741 if (m_uint32Values)
1742 {
1743 if (WorldObject* viewpoint = GetViewpoint())
1744 {
1745 LOG_FATAL("entities.player", "Player {} has viewpoint {} {} when removed from world", GetName(), viewpoint->GetEntry(), viewpoint->GetTypeId());
1746 SetViewpoint(viewpoint, false);
1747 }
1748 }
1749}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:152
void SetViewpoint(WorldObject *target, bool apply)
Definition: Player.cpp:13116
void UnsummonPetTemporaryIfAny()
Definition: Player.cpp:14165
WorldObject * GetViewpoint() const
Definition: Player.cpp:13159
void ClearComboPointHolders()
Definition: Unit.cpp:16847
void RemoveFromWorld() override
Definition: Unit.cpp:15623
void DoLootRelease(ObjectGuid lguid)
Definition: LootHandler.cpp:270

References Unit::ClearComboPointHolders(), Unit::ClearComboPoints(), WorldSession::DoLootRelease(), GetLootGUID(), WorldObject::GetName(), GetViewpoint(), Object::IsInWorld(), LOG_FATAL, m_items, m_session, Object::m_uint32Values, m_zoneUpdateId, mMitems, PLAYER_SLOT_END, PLAYER_SLOT_START, Object::RemoveFromWorld(), Unit::RemoveFromWorld(), sBattlefieldMgr, SetViewpoint(), sOutdoorPvPMgr, StopCastingBindSight(), StopCastingCharm(), and UnsummonPetTemporaryIfAny().

Referenced by Map::RemovePlayerFromMap().

◆ RemoveItem()

void Player::RemoveItem ( uint8  bag,
uint8  slot,
bool  update,
bool  swap = false 
)
2915{
2916 // note: removeitem does not actually change the item
2917 // it only takes the item out of storage temporarily
2918 // note2: if removeitem is to be used for delinking
2919 // the item must be removed from the player's updatequeue
2920
2921 Item* pItem = GetItemByPos(bag, slot);
2922 if (pItem)
2923 {
2924 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
2925
2927 RemoveItemDurations(pItem);
2928 RemoveTradeableItem(pItem);
2929
2930 if (bag == INVENTORY_SLOT_BAG_0)
2931 {
2932 if (slot < INVENTORY_SLOT_BAG_END)
2933 {
2934 ItemTemplate const* pProto = pItem->GetTemplate();
2935 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2936
2937 if (pProto && pProto->ItemSet)
2938 RemoveItemsSetItem(this, pProto);
2939
2940 _ApplyItemMods(pItem, slot, false);
2941 }
2942
2943 m_items[slot] = nullptr;
2944
2945 // remove item dependent auras and casts (only weapon and armor slots)
2946 if (slot < INVENTORY_SLOT_BAG_END && slot < EQUIPMENT_SLOT_END)
2947 {
2948 // Xinef: Ensure that this function is called for places with swap=true
2949 if (!swap)
2950 {
2952 }
2953
2954 // remove held enchantments, update expertise
2955 if (slot == EQUIPMENT_SLOT_MAINHAND)
2956 {
2958 }
2959 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2960 {
2962 }
2963
2964 // update armor penetration - passive auras may need it
2965 switch (slot)
2966 {
2971 default:
2972 break;
2973 }
2974 }
2975
2977
2978 if (slot < EQUIPMENT_SLOT_END)
2979 SetVisibleItemSlot(slot, nullptr);
2980 }
2981 else if (Bag* pBag = GetBagByPos(bag))
2982 pBag->RemoveItem(slot, update);
2983
2985 // pItem->SetGuidValue(ITEM_FIELD_OWNER, ObjectGuid::Empty); not clear owner at remove (it will be set at store). This used in mail and auction code
2986 pItem->SetSlot(NULL_SLOT);
2987 if (IsInWorld() && update)
2988 pItem->SendUpdateToPlayer(this);
2989 }
2990}

References _ApplyItemMods(), BASE_ATTACK, CR_ARMOR_PENETRATION, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), ITEM_FIELD_CONTAINED, ItemTemplate::ItemSet, LOG_DEBUG, m_items, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), RemoveEnchantmentDurations(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Object::SetGuidValue(), Item::SetSlot(), SetVisibleItemSlot(), and UpdateExpertise().

Referenced by AutoUnequipOffhandIfNeed(), Create(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ RemoveItemDependentAurasAndCasts()

void Player::RemoveItemDependentAurasAndCasts ( Item pItem)
12525{
12526 for (AuraMap::iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end();)
12527 {
12528 Aura* aura = itr->second;
12529
12530 // skip passive (passive item dependent spells work in another way) and not self applied auras
12531 SpellInfo const* spellInfo = aura->GetSpellInfo();
12532 if (aura->IsPassive() || aura->GetCasterGUID() != GetGUID())
12533 {
12534 ++itr;
12535 continue;
12536 }
12537
12538 // skip if not item dependent or have alternative item
12539 if (HasItemFitToSpellRequirements(spellInfo, pItem))
12540 {
12541 ++itr;
12542 continue;
12543 }
12544
12545 // no alt item, remove aura, restart check
12546 RemoveOwnedAura(itr);
12547 }
12548
12549 // currently casted spells can be dependent from item
12550 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
12551 if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
12552 if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem))
12554}
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
#define CURRENT_MAX_SPELL
Definition: Unit.h:544
CurrentSpellTypes
Definition: Unit.h:536
bool HasItemFitToSpellRequirements(SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
Definition: Player.cpp:12462

References CURRENT_MAX_SPELL, Aura::GetCasterGUID(), Unit::GetCurrentSpell(), Object::GetGUID(), Aura::GetSpellInfo(), HasItemFitToSpellRequirements(), Unit::InterruptSpell(), Aura::IsPassive(), Unit::m_ownedAuras, Unit::RemoveOwnedAura(), and SPELL_STATE_DELAYED.

Referenced by DestroyItem(), WorldSession::HandleAutoEquipItemOpcode(), RemoveItem(), and SwapItem().

◆ RemoveItemDurations()

void Player::RemoveItemDurations ( Item item)
12395{
12396 for (ItemDurationList::iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
12397 {
12398 if (*itr == item)
12399 {
12400 m_itemDuration.erase(itr);
12401 break;
12402 }
12403 }
12404}

References m_itemDuration.

Referenced by _SaveInventory(), _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveItemFromBuyBackSlot()

void Player::RemoveItemFromBuyBackSlot ( uint32  slot,
bool  del 
)
4011{
4012 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = {}", slot);
4013 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
4014 {
4015 Item* pItem = m_items[slot];
4016 if (pItem)
4017 {
4018 pItem->RemoveFromWorld();
4019 if (del)
4020 pItem->SetState(ITEM_REMOVED, this);
4021 }
4022
4023 m_items[slot] = nullptr;
4024
4025 uint32 eslot = slot - BUYBACK_SLOT_START;
4029
4030 // if current backslot is filled set to now free slot
4032 m_currentBuybackSlot = slot;
4033 }
4034}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, ObjectGuid::Empty, ITEM_REMOVED, LOG_DEBUG, m_currentBuybackSlot, m_items, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, Object::RemoveFromWorld(), Object::SetGuidValue(), Item::SetState(), and Unit::SetUInt32Value().

Referenced by AddItemToBuyBackSlot(), WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ RemoveMail()

void Player::RemoveMail ( uint32  id)
2840{
2841 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
2842 {
2843 if ((*itr)->messageID == id)
2844 {
2845 //do not delete item, because Player::removeMail() is called when returning mail to sender.
2846 m_mail.erase(itr);
2847 return;
2848 }
2849 }
2850}

References m_mail.

Referenced by WorldSession::HandleMailReturnToSender().

◆ RemoveMItem()

bool Player::RemoveMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1665 {
1666 return !!mMitems.erase(itemLowGuid);
1667 }

References mMitems.

Referenced by WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ RemovePet()

void Player::RemovePet ( Pet pet,
PetSaveMode  mode,
bool  returnreagent = false 
)
9014{
9015 if (!pet)
9016 pet = GetPet();
9017
9018 if (pet)
9019 {
9020 // xinef: dont save dead pet as current, save him not in slot
9021 if (!pet->IsAlive() && mode == PET_SAVE_AS_CURRENT && pet->getPetType() == HUNTER_PET)
9022 {
9023 mode = PET_SAVE_NOT_IN_SLOT;
9025 }
9026
9027 LOG_DEBUG("entities.pet", "RemovePet {}, {}, {}", pet->GetEntry(), mode, returnreagent);
9028 if (pet->m_removed)
9029 return;
9030 }
9031
9032 if (returnreagent && (pet || (m_temporaryUnsummonedPetNumber && (!m_session || !m_session->PlayerLogout()))) && !InBattleground())
9033 {
9034 //returning of reagents only for players, so best done here
9036 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9037
9038 if (spellInfo)
9039 {
9040 for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i)
9041 {
9042 if (spellInfo->Reagent[i] > 0)
9043 {
9044 ItemPosCountVec dest; //for succubus, voidwalker, felhunter and felguard credit soulshard when despawn reason other than death (out of range, logout)
9045 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, spellInfo->Reagent[i], spellInfo->ReagentCount[i]);
9046 if (msg == EQUIP_ERR_OK)
9047 {
9048 Item* item = StoreNewItem(dest, spellInfo->Reagent[i], true);
9049 if (IsInWorld())
9050 SendNewItem(item, spellInfo->ReagentCount[i], true, false);
9051 }
9052 }
9053 }
9054 }
9056 }
9057
9058 if (!pet)
9059 {
9060 if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable && m_petStable->CurrentPet)
9061 {
9062 // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
9064 stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
9065 stmt->SetData(1, GetGUID().GetCounter());
9066 stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
9067 CharacterDatabase.Execute(stmt);
9068
9069 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9070 m_petStable->CurrentPet.reset();
9071 }
9072
9073 return;
9074 }
9075 else
9076 {
9077 pet->CombatStop();
9078
9079 // only if current pet in slot
9080 pet->SavePetToDB(mode);
9081
9082 if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber())
9083 {
9084 if (mode == PET_SAVE_NOT_IN_SLOT)
9085 {
9086 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9087 m_petStable->CurrentPet.reset();
9088 }
9089 else if (mode == PET_SAVE_AS_DELETED)
9090 m_petStable->CurrentPet.reset();
9091 // else if (stable slots) handled in opcode handlers due to required swaps
9092 // else (current pet) doesnt need to do anything
9093 }
9094
9095 SetMinion(pet, false);
9096
9097 pet->AddObjectToRemoveList();
9098 pet->m_removed = true;
9099
9100 if (pet->isControlled())
9101 {
9103 data << uint64(0);
9104 GetSession()->SendPacket(&data);
9105
9106 if (GetGroup())
9108 }
9109
9111 {
9114 }
9115 }
9116}
@ GROUP_UPDATE_PET
Definition: Group.h:120
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
@ PET_SAVE_AS_DELETED
Definition: PetDefines.h:41
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
Definition: CharacterDatabase.h:480
#define MAX_SPELL_REAGENTS
Definition: DBCStructure.h:1639
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
void AddObjectToRemoveList()
Definition: Object.cpp:2149
PetType getPetType() const
Definition: Pet.h:52
bool isControlled() const
Definition: Pet.h:54
bool m_removed
Definition: Pet.h:142
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2450
uint32 GetPetNumber() const
Definition: CharmInfo.h:130
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition: SpellInfo.h:373
std::array< uint32, MAX_SPELL_REAGENTS > ReagentCount
Definition: SpellInfo.h:374

References WorldObject::AddObjectToRemoveList(), CanStoreNewItem(), CHAR_UPD_CHAR_PET_SLOT_BY_ID, CharacterDatabase, Unit::CombatStop(), EQUIP_ERR_OK, CreatureTemplate::family, WorldObject::FindMap(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetPet(), CharmInfo::GetPetNumber(), Pet::getPetType(), GetSession(), Object::GetUInt32Value(), GROUP_UPDATE_PET, HUNTER_PET, InBattleground(), Unit::IsAlive(), Pet::isControlled(), Object::IsInWorld(), LOG_DEBUG, m_oldpetspell, m_petStable, Pet::m_removed, m_session, m_temporaryUnsummonedPetNumber, MAX_SPELL_REAGENTS, NeedSendSpectatorData(), NULL_BAG, NULL_SLOT, PET_SAVE_AS_CURRENT, PET_SAVE_AS_DELETED, PET_SAVE_NOT_IN_SLOT, WorldSession::PlayerLogout(), SpellInfo::Reagent, SpellInfo::ReagentCount, Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), SendNewItem(), WorldSession::SendPacket(), PreparedStatementBase::SetData(), SetGroupUpdateFlag(), Unit::SetMinion(), SMSG_PET_SPELLS, sSpellMgr, StoreNewItem(), and UNIT_CREATED_BY_SPELL.

Referenced by Spell::_cast(), ActivateSpec(), Spell::EffectSummonPet(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Pet::Remove(), resetTalents(), setDeathState(), SummonPet(), UnsummonPetTemporaryIfAny(), and Update().

◆ RemovePetitionsAndSigns()

void Player::RemovePetitionsAndSigns ( ObjectGuid  guid,
uint32  type 
)
static
10065{
10066 SignatureContainer* signatureStore = sPetitionMgr->GetSignatureStore();
10067 for (SignatureContainer::iterator itr = signatureStore->begin(); itr != signatureStore->end(); ++itr)
10068 {
10069 SignatureMap::iterator signItr = itr->second.signatureMap.find(guid);
10070 if (signItr != itr->second.signatureMap.end())
10071 {
10072 Petition const* petition = sPetitionMgr->GetPetition(itr->first);
10073 if (!petition || (type != 10 && type != petition->petitionType))
10074 continue;
10075
10076 // erase this
10077 itr->second.signatureMap.erase(signItr);
10078
10079 // send update if charter owner in game
10081 if (owner)
10082 owner->GetSession()->SendPetitionQueryOpcode(petition->petitionGuid);
10083 }
10084 }
10085
10086 if (type == 10)
10087 {
10089 stmt->SetData(0, guid.GetCounter());
10090 CharacterDatabase.Execute(stmt);
10091 }
10092 else
10093 {
10095 stmt->SetData(0, guid.GetCounter());
10096 stmt->SetData(1, uint8(type));
10097 CharacterDatabase.Execute(stmt);
10098 }
10099
10100 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10101 if (type == 10)
10102 {
10104 stmt->SetData(0, guid.GetCounter());
10105 trans->Append(stmt);
10106
10107 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER);
10108 stmt->SetData(0, guid.GetCounter());
10109 trans->Append(stmt);
10110
10111 // xinef: clear petition store
10112 sPetitionMgr->RemovePetitionByOwnerAndType(guid, 0);
10113 }
10114 else
10115 {
10117 stmt->SetData(0, guid.GetCounter());
10118 stmt->SetData(1, uint8(type));
10119 trans->Append(stmt);
10120
10122 stmt->SetData(0, guid.GetCounter());
10123 stmt->SetData(1, uint8(type));
10124 trans->Append(stmt);
10125
10126 // xinef: clear petition store
10127 sPetitionMgr->RemovePetitionByOwnerAndType(guid, uint8(type));
10128 }
10129 CharacterDatabase.CommitTransaction(trans);
10130}
#define sPetitionMgr
Definition: PetitionMgr.h:88
std::map< ObjectGuid, Signatures > SignatureContainer
Definition: PetitionMgr.h:53
@ CHAR_DEL_PETITION_SIGNATURE
Definition: CharacterDatabase.h:235
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER
Definition: CharacterDatabase.h:448
@ CHAR_DEL_ALL_PETITION_SIGNATURES
Definition: CharacterDatabase.h:234
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:450
@ CHAR_DEL_PETITION_BY_OWNER
Definition: CharacterDatabase.h:447
@ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:449
Definition: PetitionMgr.h:40
ObjectGuid petitionGuid
Definition: PetitionMgr.h:41
ObjectGuid ownerGuid
Definition: PetitionMgr.h:42
uint8 petitionType
Definition: PetitionMgr.h:43
void SendPetitionQueryOpcode(ObjectGuid petitionguid)
Definition: PetitionsHandler.cpp:278

References CHAR_DEL_ALL_PETITION_SIGNATURES, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, CHAR_DEL_PETITION_SIGNATURE, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetSession(), Petition::ownerGuid, Petition::petitionGuid, Petition::petitionType, WorldSession::SendPetitionQueryOpcode(), PreparedStatementBase::SetData(), and sPetitionMgr.

Referenced by Guild::AddMember(), ArenaTeam::AddMember(), and DeleteFromDB().

◆ RemovePlayerFlag()

◆ RemoveQuestSlotState()

void Player::RemoveQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ RemoveReceivedSpectatorResetFor()

void Player::RemoveReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2562{ m_receivedSpectatorResetFor.erase(guid); }

References m_receivedSpectatorResetFor.

◆ RemoveRestFlag()

void Player::RemoveRestFlag ( RestFlag  restFlag)
16115{
16116 uint32 oldRestMask = _restFlagMask;
16117 _restFlagMask &= ~restFlag;
16118
16119 if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove
16120 {
16121 _restTime = 0;
16123 }
16124}

References _restFlagMask, _restTime, PLAYER_FLAGS_RESTING, and RemovePlayerFlag().

Referenced by Update(), UpdateArea(), and UpdateZone().

◆ RemoveRestState()

void Player::RemoveRestState ( )

◆ RemoveRewardedQuest()

void Player::RemoveRewardedQuest ( uint32  questId,
bool  update = true 
)
1508{
1509 RewardedQuestSet::iterator rewItr = m_RewardedQuests.find(questId);
1510 if (rewItr != m_RewardedQuests.end())
1511 {
1512 m_RewardedQuests.erase(rewItr);
1513 m_RewardedQuestsSave[questId] = false;
1514 }
1515
1516 if (update)
1517 SendQuestUpdate(questId);
1518}

References m_RewardedQuests, m_RewardedQuestsSave, and SendQuestUpdate().

Referenced by Spell::EffectQuestClear().

◆ RemoveRunesByAuraEffect()

void Player::RemoveRunesByAuraEffect ( AuraEffect const *  aura)
13334{
13335 for (uint8 i = 0; i < MAX_RUNES; ++i)
13336 {
13337 if (m_runes->runes[i].ConvertAura == aura)
13338 {
13339 ConvertRune(i, GetBaseRune(i));
13340 SetRuneConvertAura(i, nullptr);
13341 }
13342 }
13343}
AuraEffect const * ConvertAura
Definition: Player.h:422

References RuneInfo::ConvertAura, ConvertRune(), GetBaseRune(), m_runes, MAX_RUNES, Runes::runes, and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), and AuraEffect::HandlePeriodicDummyAuraTick().

◆ removeSpell()

void Player::removeSpell ( uint32  spellId,
uint8  removeSpecMask,
bool  onlyTemporary 
)
3312{
3313 PlayerSpellMap::iterator itr = m_spells.find(spell_id);
3314 if (itr == m_spells.end())
3315 return;
3316
3317 // pussywizard: nothing to do if already removed or not in specs of removeSpecMask
3318 if (itr->second->State == PLAYERSPELL_REMOVED || (itr->second->specMask & removeSpecMask) == 0)
3319 return;
3320
3321 // pussywizard: avoid any possible bugs
3322 if (onlyTemporary && itr->second->State != PLAYERSPELL_TEMPORARY)
3323 return;
3324
3325 // pussywizard: remove non-talent higher ranks (recursive)
3326 // pussywizard: do this at the beginning, not in the middle of removing!
3327 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spell_id))
3328 if (!GetTalentSpellPos(nextSpell))
3329 removeSpell(nextSpell, removeSpecMask, onlyTemporary);
3330
3331 // xinef: if current spell has talentcost, remove spells requiring this spell
3332 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spell_id);
3333 if (GetTalentSpellCost(firstRankSpellId))
3334 {
3335 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(firstRankSpellId);
3336 for (auto spellsItr = spellsRequiringSpell.first; spellsItr != spellsRequiringSpell.second; ++spellsItr)
3337 {
3338 removeSpell(spellsItr->second, removeSpecMask, onlyTemporary);
3339 }
3340 }
3341
3342 // pussywizard: re-search, it can be corrupted in prev loop
3343 itr = m_spells.find(spell_id);
3344 if (itr == m_spells.end())
3345 return;
3346
3347 itr->second->specMask = (((uint8)itr->second->specMask) & ~removeSpecMask); // pussywizard: update specMask in map
3348
3349 // pussywizard: some more conditions needed for spells like pyroblast (shouldn't be fully removed when not available in any spec, should stay in db with specMask = 0)
3350 if (GetTalentSpellCost(firstRankSpellId) == 0 && !sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId) && itr->second->specMask == 0)
3351 {
3352 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_TEMPORARY)
3353 {
3354 delete itr->second;
3355 m_spells.erase(itr);
3356 }
3357 else
3358 itr->second->State = PLAYERSPELL_REMOVED;
3359 }
3360 else if (itr->second->State != PLAYERSPELL_NEW && itr->second->State != PLAYERSPELL_TEMPORARY)
3361 itr->second->State = PLAYERSPELL_CHANGED;
3362
3363 // xinef: this is used for talents and they are not removed in removeSpell function...
3364 // xinef: however ill leave this here just in case
3365 // pussywizard: remove owned aura obtained from currently removed spell
3366 RemoveOwnedAura(spell_id);
3367
3368 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
3369 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3370 {
3371 // pussywizard: remove pet auras
3372 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
3373 RemovePetAura(petSpell);
3374
3375 // pussywizard: remove all triggered auras
3376 if (spellInfo->Effects[i].TriggerSpell > 0)
3377 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3378 }
3379
3380 // pussywizard: update free primary prof points
3381 if (spellInfo->IsPrimaryProfessionFirstRank())
3382 {
3383 uint32 freeProfs = GetFreePrimaryProfessionPoints() + 1;
3384 if (freeProfs <= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
3385 SetFreePrimaryProfessions(freeProfs);
3386 }
3387
3388 // pussywizard: update 310 flyer
3389 if (Has310Flyer(false))
3390 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3391 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3392 Has310Flyer(true, spell_id);
3393
3394 // pussywizard: remove dependent skill
3395 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spell_id);
3396 if (spellLearnSkill)
3397 {
3398 uint32 prev_spell = sSpellMgr->GetPrevSpellInChain(spell_id);
3399
3400 if (!prev_spell) // pussywizard: first rank, remove skill
3401 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3402 else // pussywizard: search previous ranks
3403 {
3404 SpellLearnSkillNode const* prevSkill = sSpellMgr->GetSpellLearnSkill(prev_spell);
3405 while (!prevSkill && prev_spell)
3406 {
3407 prev_spell = sSpellMgr->GetPrevSpellInChain(prev_spell);
3408 prevSkill = sSpellMgr->GetSpellLearnSkill(sSpellMgr->GetFirstSpellInChain(prev_spell));
3409 }
3410
3411 if (!prevSkill) // pussywizard: not found prev skill setting, remove skill
3412 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3413 else // pussywizard: set to prev skill setting values
3414 {
3415 uint32 skill_value = GetPureSkillValue(prevSkill->skill);
3416 uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
3417 uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
3418
3419 if (skill_value > prevSkill->value)
3420 skill_value = prevSkill->value;
3421 if (skill_max_value > new_skill_max_value)
3422 skill_max_value = new_skill_max_value;
3423
3424 SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
3425 }
3426 }
3427 }
3428 else
3429 {
3430 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
3431 // most likely will never be used, haven't heard of cases where players unlearn a mount
3432 if (Has310Flyer(false) && spellInfo)
3433 {
3434 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3435 {
3436 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3437 if (!pSkill)
3438 continue;
3439
3440 if (_spell_idx->second->SkillLine == SKILL_MOUNTS)
3441 {
3442 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3443 {
3444 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3445 spellInfo->Effects[i].CalcValue() == 310)
3446 {
3447 Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag
3448 break;
3449 }
3450 }
3451 }
3452 }
3453 }
3454 }
3455
3456 // pussywizard: remove from spell book (can't be replaced by previous rank, because such spells can't be unlearnt)
3457 if (!onlyTemporary || ((!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)))
3458 {
3459 sScriptMgr->OnPlayerForgotSpell(this, spell_id);
3460 SendLearnPacket(spell_id, false);
3461 }
3462}

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SpellInfo::Effects, GetFreePrimaryProfessionPoints(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetTalentSpellCost(), GetTalentSpellPos(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), SpellInfo::IsPrimaryProfessionFirstRank(), m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SendLearnPacket(), SetFreePrimaryProfessions(), SetSkill(), SpellLearnSkillNode::skill, SKILL_MOUNTS, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSkillLineStore, sSpellMgr, SpellLearnSkillNode::step, and SpellLearnSkillNode::value.

Referenced by _removeTalentAurasAndSpells(), Spell::EffectUnlearnSpecialization(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraOverrideSpells(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), learnSkillRewardedSpells(), ProfessionUnlearnSpells(), removeSpell(), resetSpells(), resetTalents(), and SetSkill().

◆ RemoveSpellCooldown()

◆ RemoveSpellMods()

void Player::RemoveSpellMods ( Spell spell)
9966{
9967 if (!spell)
9968 return;
9969
9970 if (spell->m_appliedMods.empty())
9971 return;
9972
9973 SpellInfo const* const spellInfo = spell->m_spellInfo;
9974
9975 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9976 {
9977 for (SpellModList::const_iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();)
9978 {
9979 SpellModifier* mod = *itr;
9980 ++itr;
9981
9982 // don't handle spells with proc_event entry defined
9983 // this is a temporary workaround, because all spellmods should be handled like that
9984 if (sSpellMgr->GetSpellProcEvent(mod->spellId))
9985 {
9986 continue;
9987 }
9988
9989 // spellmods without aura set cannot be charged
9990 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9991 continue;
9992
9993 // check if mod affected this spell
9994 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9995 if (iterMod == spell->m_appliedMods.end())
9996 continue;
9997
9998 // remove from list
9999 // leave this here, if spell have two mods it will remove 2 charges - wrong
10000 spell->m_appliedMods.erase(iterMod);
10001
10002 // MAGE T8P4 BONUS
10003 if( spellInfo->SpellFamilyName == SPELLFAMILY_MAGE )
10004 {
10005 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
10006 // Missile Barrage, Hot Streak, Brain Freeze (trigger spell - Fireball!)
10007 if( sp->SpellIconID == 3261 || sp->SpellIconID == 2999 || sp->SpellIconID == 2938 )
10008 if( AuraEffect* aurEff = GetAuraEffectDummy(64869) )
10009 if( roll_chance_i(aurEff->GetAmount()) )
10010 {
10011 mod->charges = 1;
10012 continue;
10013 }
10014 }
10015
10017 itr = m_spellMods[i].begin();
10018 }
10019 }
10020}
#define MAX_SPELLMOD
Definition: SpellDefines.h:110
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5501
bool IsUsingCharges() const
Definition: SpellAuras.h:200
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.h:146
SpellInfo const *const m_spellInfo
Definition: Spell.h:520
uint32 SpellIconID
Definition: SpellInfo.h:380

References AURA_REMOVE_BY_EXPIRE, SpellModifier::charges, Aura::DropCharge(), Unit::GetAuraEffectDummy(), Aura::GetSpellInfo(), Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, MAX_SPELLMOD, SpellModifier::ownerAura, roll_chance_i(), SPELLFAMILY_MAGE, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SpellModifier::spellId, and sSpellMgr.

Referenced by Spell::_cast().

◆ RemoveTimedAchievement()

void Player::RemoveTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry 
)
13874{
13876}
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition: AchievementMgr.cpp:2206

References m_achievementMgr, and AchievementMgr::RemoveTimedAchievement().

Referenced by InstanceScript::DoStopTimedAchievement(), and WorldSession::HandleQuestLogRemoveQuest().

◆ RemoveTimedQuest()

void Player::RemoveTimedQuest ( uint32  quest_id)
inline
1545{ m_timedquests.erase(quest_id); }

References m_timedquests.

Referenced by FailQuest(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveTradeableItem()

◆ ReplaceAllPlayerFlags()

void Player::ReplaceAllPlayerFlags ( PlayerFlags  flags)
inline
1110{ SetUInt32Value(PLAYER_FLAGS, flags); }

References PLAYER_FLAGS, and Unit::SetUInt32Value().

Referenced by LoadFromDB().

◆ RepopAtGraveyard()

void Player::RepopAtGraveyard ( )
4863{
4864 // note: this can be called also when the player is alive
4865 // for example from WorldSession::HandleMovementOpcodes
4866
4867 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId());
4868
4869 if (!sScriptMgr->CanRepopAtGraveyard(this))
4870 return;
4871
4872 // Such zones are considered unreachable as a ghost and the player must be automatically revived
4873 // Xinef: Get Transport Check is not needed
4874 if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) /*|| GetTransport()*/ || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4875 {
4876 ResurrectPlayer(0.5f);
4878 }
4879
4880 GraveyardStruct const* ClosestGrave = nullptr;
4881
4882 // Special handle for battleground maps
4883 if (Battleground* bg = GetBattleground())
4884 ClosestGrave = bg->GetClosestGraveyard(this);
4885 else
4886 {
4887 if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
4888 ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveyard(this);
4889 else
4890 ClosestGrave = sGraveyard->GetClosestGraveyard(this, GetTeamId());
4891 }
4892
4893 // stop countdown until repop
4894 m_deathTimer = 0;
4895
4896 // if no grave found, stay at the current location
4897 // and don't show spirit healer location
4898 if (ClosestGrave)
4899 {
4900 TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
4901 if (isDead()) // not send if alive, because it used in TeleportTo()
4902 {
4903 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // show spirit healer position on minimap
4904 data << ClosestGrave->Map;
4905 data << ClosestGrave->x;
4906 data << ClosestGrave->y;
4907 data << ClosestGrave->z;
4908 GetSession()->SendPacket(&data);
4909 }
4910 }
4911 else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4913
4915}
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:488
#define sGraveyard
Definition: GameGraveyard.h:75
@ AREA_FLAG_NEED_FLY
Definition: DBCEnums.h:246
@ SMSG_DEATH_RELEASE_LOC
Definition: Opcodes.h:918
Definition: GameGraveyard.h:28
float z
Definition: GameGraveyard.h:33
float x
Definition: GameGraveyard.h:31
float y
Definition: GameGraveyard.h:32
uint32 Map
Definition: GameGraveyard.h:30

References AREA_FLAG_NEED_FLY, AreaTableEntry::flags, WorldObject::GetAreaId(), GetBattleground(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), GetTeamId(), WorldObject::GetZoneId(), Unit::IsAlive(), Unit::isDead(), m_deathTimer, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GraveyardStruct::Map, PLAYER_FLAGS_IS_OUT_OF_BOUNDS, RemovePlayerFlag(), ResurrectPlayer(), sAreaTableStore, sBattlefieldMgr, WorldSession::SendPacket(), sGraveyard, SMSG_DEATH_RELEASE_LOC, SpawnCorpseBones(), sScriptMgr, TeleportTo(), GraveyardStruct::x, GraveyardStruct::y, and GraveyardStruct::z.

Referenced by Spell::EffectStuck(), HandleDrowning(), WorldSession::HandleInstanceLockResponse(), WorldSession::HandleRepopRequestOpcode(), misc_commandscript::HandleUnstuckCommand(), WorldSession::LogoutPlayer(), RemovedInsignia(), TeleportTo(), Update(), and UpdateHomebindTime().

◆ ReportedAfkBy()

void Player::ReportedAfkBy ( Player reporter)

This player has been blamed to be inactive in a battleground.

11331{
11333 // Battleground also must be in progress!
11334 if (!bg || bg != reporter->GetBattleground() || GetTeamId() != reporter->GetTeamId() || bg->GetStatus() != STATUS_IN_PROGRESS)
11335 return;
11336
11337 // Xinef: 2 minutes startup + 2 minute of match
11339 return;
11340
11341 // check if player has 'Idle' or 'Inactive' debuff
11342 if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit())
11343 {
11344 m_bgData.bgAfkReporter.insert(reporter->GetGUID());
11345 // by default 3 players have to complain to apply debuff
11346 if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK))
11347 {
11348 // cast 'Idle' spell
11349 CastSpell(this, 43680, true);
11350 m_bgData.bgAfkReporter.clear();
11351 }
11352 }
11353}
@ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER
Definition: IWorld.h:316
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition: IWorld.h:317
uint32 GetStartTime() const
Definition: Battleground.h:329
bool CanReportAfkDueToLimit()
Definition: Player.cpp:11320

References BGData::bgAfkReporter, CanReportAfkDueToLimit(), Unit::CastSpell(), CONFIG_BATTLEGROUND_REPORT_AFK, CONFIG_BATTLEGROUND_REPORT_AFK_TIMER, GetBattleground(), Object::GetGUID(), Battleground::GetStartTime(), Battleground::GetStatus(), GetTeamId(), Unit::HasAura(), IN_MILLISECONDS, m_bgData, MINUTE, STATUS_IN_PROGRESS, and sWorld.

Referenced by WorldSession::HandleReportPvPAFK().

◆ ReputationChanged()

void Player::ReputationChanged ( FactionEntry const *  factionEntry)
2203{
2204 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2205 {
2206 if (uint32 questid = GetQuestSlotQuestId(i))
2207 {
2208 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2209 {
2210 if (qInfo->GetRepObjectiveFaction() == factionEntry->ID)
2211 {
2212 QuestStatusData& q_status = m_QuestStatus[questid];
2213 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2214 {
2215 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue())
2216 if (CanCompleteQuest(questid))
2217 CompleteQuest(questid);
2218 }
2219 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2220 {
2221 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue())
2222 IncompleteQuest(questid);
2223 }
2224 }
2225 }
2226 }
2227 }
2228}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by ReputationMgr::SetOneFactionReputation().

◆ ReputationChanged2()

void Player::ReputationChanged2 ( FactionEntry const *  factionEntry)
2231{
2232 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2233 {
2234 if (uint32 questid = GetQuestSlotQuestId(i))
2235 {
2236 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2237 {
2238 if (qInfo->GetRepObjectiveFaction2() == factionEntry->ID)
2239 {
2240 QuestStatusData& q_status = m_QuestStatus[questid];
2241 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2242 {
2243 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue2())
2244 if (CanCompleteQuest(questid))
2245 CompleteQuest(questid);
2246 }
2247 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2248 {
2249 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue2())
2250 IncompleteQuest(questid);
2251 }
2252 }
2253 }
2254 }
2255 }
2256}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

◆ ResetAchievementCriteria()

void Player::ResetAchievementCriteria ( AchievementCriteriaCondition  condition,
uint32  value,
bool  evenIfCriteriaComplete = false 
)
13879{
13880 m_achievementMgr->ResetAchievementCriteria(condition, value, evenIfCriteriaComplete);
13881}
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: AchievementMgr.cpp:514

References m_achievementMgr, and AchievementMgr::ResetAchievementCriteria().

Referenced by Battleground::AddPlayer(), spell_algalon_supermassive_fail::RecalculateDamage(), Battleground::RemovePlayerAtLeave(), and setDeathState().

◆ ResetAchievements()

void Player::ResetAchievements ( )
13854{
13856}
void Reset()
Definition: AchievementMgr.cpp:490

References m_achievementMgr, and AchievementMgr::Reset().

Referenced by reset_commandscript::HandleResetAchievementsCommand().

◆ ResetAllPowers()

◆ ResetContestedPvP()

void Player::ResetContestedPvP ( )
inline
1847 {
1851 }
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:482
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:163
void ClearUnitState(uint32 f)
Definition: Unit.h:740

References Unit::ClearUnitState(), m_contestedPvPTimer, PLAYER_FLAGS_CONTESTED_PVP, RemovePlayerFlag(), and UNIT_STATE_ATTACK_PLAYER.

Referenced by SetGameMaster(), SetIsSpectator(), and UpdateContestedPvP().

◆ ResetDailyQuestStatus()

void Player::ResetDailyQuestStatus ( )
12107{
12108 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12109 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
12110
12111 m_DFQuests.clear(); // Dungeon Finder Quests.
12112
12113 // DB data deleted in caller
12114 m_DailyQuestChanged = false;
12116}

References m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and Unit::SetUInt32Value().

◆ ResetFarSightDistance()

void Player::ResetFarSightDistance ( )
16225{
16226 _farSightDistance.reset();
16227}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ ResetInstances()

void Player::ResetInstances ( ObjectGuid  guid,
uint8  method,
bool  isRaid 
)
static

Reset all solo instances and optionally send a message on success for each.

196{
197 switch (method)
198 {
200 {
202 if (!p || p->GetDifficulty(false) != DUNGEON_DIFFICULTY_NORMAL)
203 break;
204 std::vector<InstanceSave*> toUnbind;
205 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(DUNGEON_DIFFICULTY_NORMAL));
206 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
207 {
208 InstanceSave* instanceSave = itr->second.save;
209 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
210 if (!entry || entry->IsRaid() || !instanceSave->CanReset())
211 {
212 continue;
213 }
214
215 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
216 if (!map || map->ToInstanceMap()->Reset(method))
217 {
218 p->SendResetInstanceSuccess(instanceSave->GetMapId());
219 toUnbind.push_back(instanceSave);
220 }
221 else
222 {
223 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
224 }
225
226 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
227 }
228 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
229 {
230 sInstanceSaveMgr->UnbindAllFor(*itr);
231 }
232 }
233 break;
235 {
237 if (!p)
238 break;
239 std::vector<InstanceSave*> toUnbind;
240 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), p->GetDifficulty(isRaid));
241 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
242 {
243 InstanceSave* instanceSave = itr->second.save;
244 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
245 if (!entry || entry->IsRaid() != isRaid || !instanceSave->CanReset())
246 {
247 continue;
248 }
249
250 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
251 if (!map || map->ToInstanceMap()->Reset(method))
252 {
253 p->SendResetInstanceSuccess(instanceSave->GetMapId());
254 toUnbind.push_back(instanceSave);
255 }
256 else
257 {
258 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
259 }
260
261 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
262 }
263 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
264 sInstanceSaveMgr->UnbindAllFor(*itr);
265 }
266 break;
268 {
270 if (!p)
271 break;
272 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
273 {
274 std::vector<InstanceSave*> toUnbind;
275 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(d));
276 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
277 {
278 if (itr->second.perm)
279 continue;
280 InstanceSave* instanceSave = itr->second.save;
281 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
282 if (!map || p->FindMap() != map)
283 {
284 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
285 toUnbind.push_back(instanceSave);
286 }
287 //else
288 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
289
290 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
291 }
292 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
293 sInstanceSaveMgr->PlayerUnbindInstance(p->GetGUID(), (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
294 }
295 }
296 break;
298 {
300 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
301 {
302 std::vector<InstanceSave*> toUnbind;
303 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(guid, Difficulty(d));
304 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
305 {
306 if (itr->second.perm)
307 continue;
308 InstanceSave* instanceSave = itr->second.save;
309 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
310 if (!p || !map || p->FindMap() != map)
311 {
312 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
313 toUnbind.push_back(instanceSave);
314 }
315 //else
316 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
317 }
318 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
319 sInstanceSaveMgr->PlayerUnbindInstance(guid, (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
320 }
321 }
322 break;
323 }
324}
@ INSTANCE_RESET_GROUP_JOIN
Definition: Map.h:814
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition: Map.h:812
@ INSTANCE_RESET_GROUP_LEAVE
Definition: Map.h:815
@ INSTANCE_RESET_ALL
Definition: Map.h:811
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition: InstanceSaveMgr.h:46
#define MAX_DIFFICULTY
Definition: DBCEnums.h:283
void SendResetInstanceSuccess(uint32 MapId)
Definition: PlayerMisc.cpp:326
void SendResetInstanceFailed(uint32 reason, uint32 MapId)
Definition: PlayerMisc.cpp:333
uint32 GetMapId() const
Definition: InstanceSaveMgr.h:62
bool CanReset() const
Definition: InstanceSaveMgr.h:81
InstanceMap * ToInstanceMap()
Definition: Map.h:546
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition: Map.cpp:3105

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, ObjectAccessor::FindConnectedPlayer(), WorldObject::FindMap(), GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_GROUP_JOIN, INSTANCE_RESET_GROUP_LEAVE, MapEntry::IsRaid(), MAX_DIFFICULTY, InstanceMap::Reset(), SendResetInstanceFailed(), SendResetInstanceSuccess(), sInstanceSaveMgr, sMapMgr, sMapStore, and Map::ToInstanceMap().

Referenced by Group::AddMember(), Group::Disband(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), and Group::RemoveMember().

◆ ResetMap()

void Player::ResetMap ( )
overridevirtual

Reimplemented from WorldObject.

14611{
14612 // this may be called during Map::Update
14613 // after decrement+unlink, ++m_mapRefIter will continue correctly
14614 // when the first element of the list is being removed
14615 // nocheck_prev will return the padding element of the RefMgr
14616 // instead of nullptr in the case of prev
14617 GetMap()->UpdateIteratorBack(this);
14619 GetMapRef().unlink();
14620}
virtual void ResetMap()
Definition: Object.cpp:2131
MapReference & GetMapRef()
Definition: Player.h:2467
void UpdateIteratorBack(Player *player)
Definition: Map.cpp:3343

References WorldObject::GetMap(), GetMapRef(), WorldObject::ResetMap(), Reference< TO, FROM >::unlink(), and Map::UpdateIteratorBack().

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMonthlyQuestStatus()

void Player::ResetMonthlyQuestStatus ( )
12139{
12140 if (m_monthlyquests.empty())
12141 return;
12142
12143 m_monthlyquests.clear();
12144 // DB data deleted in caller
12145 m_MonthlyQuestChanged = false;
12146}

References m_MonthlyQuestChanged, and m_monthlyquests.

◆ ResetPetTalents()

void Player::ResetPetTalents ( )
8844{
8845 // This needs another gossip option + NPC text as a confirmation.
8846 // The confirmation gossip listid has the text: "Yes, please do."
8847 Pet* pet = GetPet();
8848
8849 if (!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
8850 return;
8851
8852 CharmInfo* charmInfo = pet->GetCharmInfo();
8853 if (!charmInfo)
8854 {
8855 LOG_ERROR("entities.player", "Object ({}) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString());
8856 return;
8857 }
8858 pet->resetTalents();
8859 SendTalentsInfoData(true);
8860}
uint32 m_usedTalentCount
Definition: Pet.h:134
bool resetTalents()
Definition: Pet.cpp:2060

References Unit::GetCharmInfo(), Object::GetGUID(), GetPet(), Pet::getPetType(), HUNTER_PET, LOG_ERROR, Pet::m_usedTalentCount, Pet::resetTalents(), SendTalentsInfoData(), and ObjectGuid::ToString().

Referenced by OnGossipSelect(), and npc_pet_trainer::npc_pet_trainerAI::sGossipSelect().

◆ ResetSeasonalQuestStatus()

void Player::ResetSeasonalQuestStatus ( uint16  event_id)
12129{
12130 if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
12131 return;
12132
12133 m_seasonalquests.erase(event_id);
12134 // DB data deleted in caller
12135 m_SeasonalQuestChanged = false;
12136}

References m_SeasonalQuestChanged, and m_seasonalquests.

◆ resetSpells()

void Player::resetSpells ( )
11772{
11773 // not need after this call
11776
11777 // make full copy of map (spells removed and marked as deleted at another spell remove
11778 // and we can't use original map for safe iterative with visit each spell at loop end
11779 PlayerSpellMap spellMap = GetSpellMap();
11780
11781 for (PlayerSpellMap::const_iterator iter = spellMap.begin(); iter != spellMap.end(); ++iter)
11782 removeSpell(iter->first, SPEC_MASK_ALL, false);
11783
11787}
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:193
@ AT_LOGIN_RESET_SPELLS
Definition: Player.h:601
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1752

References AT_LOGIN_RESET_SPELLS, GetSpellMap(), HasAtLoginFlag(), LearnCustomSpells(), LearnDefaultSkills(), learnQuestRewardedSpells(), RemoveAtLoginFlag(), removeSpell(), and SPEC_MASK_ALL.

Referenced by WorldSession::HandlePlayerLoginFromDB(), and reset_commandscript::HandleResetSpellsCommand().

◆ resetTalents()

bool Player::resetTalents ( bool  noResetCost = false)
3684{
3685 sScriptMgr->OnPlayerTalentsReset(this, noResetCost);
3686
3687 // xinef: remove at login flag upon talents reset
3690
3691 // xinef: get max available talent points amount
3692 uint32 talentPointsForLevel = CalculateTalentsPoints();
3693
3694 // xinef: no talent points are used, return
3695 if (m_usedTalentCount == 0)
3696 return false;
3698
3699 // xinef: check if we have enough money
3700 uint32 resetCost = 0;
3701 if (!noResetCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST))
3702 {
3703 resetCost = resetTalentsCost();
3704 if (!HasEnoughMoney(resetCost))
3705 {
3707 return false;
3708 }
3709 }
3710
3711 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
3712
3713 // xinef: reset talents
3714 for (PlayerTalentMap::iterator iter = m_talents.begin(); iter != m_talents.end(); )
3715 {
3716 PlayerTalentMap::iterator itr = iter++;
3717
3718 if (itr->second->State == PLAYERSPELL_REMOVED)
3719 continue;
3720
3721 // xinef: talent not in current spec
3722 if (!(itr->second->specMask & GetActiveSpecMask()))
3723 continue;
3724
3725 // xinef: remove talent auras
3726 _removeTalentAurasAndSpells(itr->first);
3727
3728 // xinef: check if talent learns spell to spell book
3729 TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID);
3730 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
3731
3732 bool removed = false;
3733 if (talentInfo->addToSpellBook)
3734 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3735 {
3736 removeSpell(itr->first, GetActiveSpecMask(), false);
3737 removed = true;
3738 }
3739
3740 // Xinef: send unlearn spell packet at talent remove
3741 if (!removed)
3742 SendLearnPacket(itr->first, false);
3743
3744 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3745 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3746 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3747 removeSpell(spellInfo->Effects[i].TriggerSpell, GetActiveSpecMask(), false);
3748
3749 // xinef: remove talent modifies m_talents, move itr to map begin
3751 }
3752
3753 // xinef: remove titan grip if player had it set
3754 if (m_canTitanGrip)
3755 SetCanTitanGrip(false);
3756 // xinef: remove dual wield if player does not have dual wield spell (shamans)
3757 if (!HasSpell(674) && m_canDualWield)
3758 SetCanDualWield(false);
3759
3761
3762 // pussywizard: removed saving to db, nothing important happens and saving only spells and talents may cause data integrity problems (eg. with skills saved to db)
3763 SetFreeTalentPoints(talentPointsForLevel);
3764
3765 if (!noResetCost)
3766 {
3767 ModifyMoney(-(int32)resetCost);
3770
3771 m_resetTalentsCost = resetCost;
3773 }
3774
3775 return true;
3776}
@ AT_LOGIN_RESET_TALENTS
Definition: Player.h:602
@ CONFIG_NO_RESET_TALENT_COST
Definition: IWorld.h:135
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition: DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition: DBCEnums.h:174
uint32 resetTalentsCost() const
Definition: Player.cpp:3650

References _removeTalent(), _removeTalentAurasAndSpells(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, TalentEntry::addToSpellBook, AT_LOGIN_RESET_TALENTS, AutoUnequipOffhandIfNeed(), BUY_ERR_NOT_ENOUGHT_MONEY, CalculateTalentsPoints(), CONFIG_NO_RESET_TALENT_COST, SpellInfo::Effects, GetActiveSpecMask(), GameTime::GetGameTime(), HasAtLoginFlag(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasEnoughMoney(), HasSpell(), Unit::m_canDualWield, m_canTitanGrip, m_resetTalentsCost, m_resetTalentsTime, m_talents, m_usedTalentCount, MAX_SPELL_EFFECTS, ModifyMoney(), PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, RemoveAtLoginFlag(), RemovePet(), removeSpell(), resetTalentsCost(), SendBuyError(), SendLearnPacket(), Unit::SetCanDualWield(), SetCanTitanGrip(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleTalentWipeConfirmOpcode(), and InitTalentForLevel().

◆ resetTalentsCost()

uint32 Player::resetTalentsCost ( ) const
3651{
3652 // The first time reset costs 1 gold
3653 if (m_resetTalentsCost < 1 * GOLD)
3654 return 1 * GOLD;
3655 // then 5 gold
3656 else if (m_resetTalentsCost < 5 * GOLD)
3657 return 5 * GOLD;
3658 // After that it increases in increments of 5 gold
3659 else if (m_resetTalentsCost < 10 * GOLD)
3660 return 10 * GOLD;
3661 else
3662 {
3663 uint64 months = (GameTime::GetGameTime().count() - m_resetTalentsTime) / MONTH;
3664 if (months > 0)
3665 {
3666 // This cost will be reduced by a rate of 5 gold per month
3667 int32 new_cost = int32(m_resetTalentsCost - 5 * GOLD * months);
3668 // to a minimum of 10 gold.
3669 return (new_cost < 10 * GOLD ? 10 * GOLD : new_cost);
3670 }
3671 else
3672 {
3673 // After that it increases in increments of 5 gold
3674 int32 new_cost = m_resetTalentsCost + 5 * GOLD;
3675 // until it hits a cap of 50 gold.
3676 if (new_cost > 50 * GOLD)
3677 new_cost = 50 * GOLD;
3678 return new_cost;
3679 }
3680 }
3681}
@ GOLD
Definition: SharedDefines.h:253
constexpr auto MONTH
Definition: Common.h:50

References GameTime::GetGameTime(), GOLD, m_resetTalentsCost, m_resetTalentsTime, and MONTH.

Referenced by resetTalents(), and SendTalentWipeConfirm().

◆ ResetWeeklyQuestStatus()

void Player::ResetWeeklyQuestStatus ( )
12119{
12120 if (m_weeklyquests.empty())
12121 return;
12122
12123 m_weeklyquests.clear();
12124 // DB data deleted in caller
12125 m_WeeklyQuestChanged = false;
12126}

References m_WeeklyQuestChanged, and m_weeklyquests.

◆ RestoreAllSpellMods()

void Player::RestoreAllSpellMods ( uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
9959{
9960 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
9961 if (m_currentSpells[i])
9962 RestoreSpellMods(m_currentSpells[i], ownerAuraId, aura);
9963}
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9891
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:1844

References CURRENT_MAX_SPELL, Unit::m_currentSpells, and RestoreSpellMods().

◆ RestoreBaseRune()

void Player::RestoreBaseRune ( uint8  index)
13346{
13347 AuraEffect const* aura = m_runes->runes[index].ConvertAura;
13348 // If rune was converted by a non-pasive aura that still active we should keep it converted
13349 if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
13350 return;
13351 ConvertRune(index, GetBaseRune(index));
13352 SetRuneConvertAura(index, nullptr);
13353 // Don't drop passive talents providing rune convertion
13354 if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE)
13355 return;
13356 for (uint8 i = 0; i < MAX_RUNES; ++i)
13357 {
13358 if (aura == m_runes->runes[i].ConvertAura)
13359 return;
13360 }
13361 aura->GetBase()->Remove();
13362}
@ SPELL_AURA_CONVERT_RUNE
Definition: SpellAuraDefines.h:312
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:447
Aura * GetBase() const
Definition: SpellAuraEffects.h:49

References RuneInfo::ConvertAura, ConvertRune(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), GetBaseRune(), AuraEffect::GetSpellInfo(), SpellInfo::HasAttribute(), m_runes, MAX_RUNES, Aura::Remove(), Runes::runes, SetRuneConvertAura(), SPELL_ATTR0_PASSIVE, and SPELL_AURA_CONVERT_RUNE.

Referenced by Spell::TakeRunePower().

◆ RestoreHealthAfterDuel()

void Player::RestoreHealthAfterDuel ( )
inline
uint32 healthBeforeDuel
Definition: Player.h:2956

References healthBeforeDuel, and Unit::SetHealth().

◆ RestoreManaAfterDuel()

void Player::RestoreManaAfterDuel ( )
inline
uint32 manaBeforeDuel
Definition: Player.h:2957

References manaBeforeDuel, POWER_MANA, and Unit::SetPower().

◆ RestoreSpellMods()

void Player::RestoreSpellMods ( Spell spell,
uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
Todo:
track these changes correctly
9892{
9893 if (!spell || spell->m_appliedMods.empty())
9894 return;
9895
9896 std::list<Aura*> aurasQueue;
9897
9898 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9899 {
9900 for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
9901 {
9902 SpellModifier* mod = *itr;
9903
9904 // Spellmods without aura set cannot be charged
9905 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9906 continue;
9907
9908 // Restore only specific owner aura mods
9909 if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellInfo()->Id))
9910 continue;
9911
9912 if (aura && mod->ownerAura != aura)
9913 continue;
9914
9915 // Check if mod affected this spell
9916 // First, check if the mod aura applied at least one spellmod to this spell
9917 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9918 if (iterMod == spell->m_appliedMods.end())
9919 continue;
9920 // Second, check if the current mod is one of those applied by the mod aura
9921 if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
9922 continue;
9923
9924 // remove from list - This will be done after all mods have been gone through
9925 // to ensure we iterate over all mods of an aura before removing said aura
9926 // from applied mods (Else, an aura with two mods on the current spell would
9927 // only see the first of its modifier restored)
9928 aurasQueue.push_back(mod->ownerAura);
9929
9930 // add mod charges back to mod
9931 if (mod->charges == -1)
9932 mod->charges = 1;
9933 else
9934 mod->charges++;
9935
9936 // Do not set more spellmods than available
9937 if (mod->ownerAura->GetCharges() < mod->charges)
9938 mod->charges = mod->ownerAura->GetCharges();
9939
9940 // Skip this check for now - aura charges may change due to various reason
9942 //ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
9943 }
9944 }
9945
9946 for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
9947 {
9948 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
9949 if (iterMod != spell->m_appliedMods.end())
9950 spell->m_appliedMods.erase(iterMod);
9951 }
9952
9953 // Xinef: clear the list just do be sure
9954 if (!ownerAuraId && !aura)
9955 spell->m_appliedMods.clear();
9956}
uint8 GetCharges() const
Definition: SpellAuras.h:141
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388

References SpellModifier::charges, Aura::GetCharges(), Aura::GetSpellInfo(), SpellInfo::Id, Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, SpellModifier::mask, MAX_SPELLMOD, SpellModifier::ownerAura, and SpellInfo::SpellFamilyFlags.

Referenced by Spell::DoAllEffectOnTarget(), Spell::finish(), Unit::HandleDummyAuraProc(), and RestoreAllSpellMods().

◆ ResummonPetTemporaryUnSummonedIfAny()

void Player::ResummonPetTemporaryUnSummonedIfAny ( )
14181{
14183 return;
14184
14185 // not resummon in not appropriate state
14187 return;
14188
14189 if (GetPetGUID())
14190 return;
14191
14193 return;
14194
14195 Pet* newPet = new Pet(this);
14196 if (!newPet->LoadPetFromDB(this, 0, m_temporaryUnsummonedPetNumber, true))
14197 delete newPet;
14198
14200}
bool IsPetNeedBeTemporaryUnsummoned() const
Definition: Player.h:2393
uint32 GetLastPetSpell() const
Definition: Player.h:2435
bool CanResummonPet(uint32 spellid)
Definition: Player.cpp:14202

References CanResummonPet(), GetLastPetSpell(), Unit::GetPetGUID(), IsPetNeedBeTemporaryUnsummoned(), IsSpectator(), Pet::LoadPetFromDB(), and m_temporaryUnsummonedPetNumber.

Referenced by Unit::_ExitVehicle(), WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ResurectUsingRequestData()

void Player::ResurectUsingRequestData ( )

Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse

12773{
12776
12777 if (IsBeingTeleported())
12778 {
12780 return;
12781 }
12782
12783 ResurrectPlayer(0.0f, false);
12784
12787 else
12788 SetFullHealth();
12789
12792 else
12794
12795 SetPower(POWER_RAGE, 0);
12796
12798
12800}
void ScheduleDelayedOperation(uint32 operation)
Definition: Player.h:2075
float m_resurrectZ
Definition: Player.h:2805
uint32 m_resurrectMap
Definition: Player.h:2804
float m_resurrectX
Definition: Player.h:2805
float m_resurrectY
Definition: Player.h:2805

References DELAYED_RESURRECT_PLAYER, Unit::GetMaxHealth(), Unit::GetMaxPower(), Position::GetOrientation(), IsBeingTeleported(), m_resurrectHealth, m_resurrectMana, m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, POWER_ENERGY, POWER_MANA, POWER_RAGE, ResurrectPlayer(), ScheduleDelayedOperation(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), and TeleportTo().

Referenced by WorldSession::HandleResurrectResponseOpcode().

◆ ResurrectPlayer()

void Player::ResurrectPlayer ( float  restore_percent,
bool  applySickness = false 
)
4416{
4417 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position
4418 data << uint32(-1);
4419 data << float(0);
4420 data << float(0);
4421 data << float(0);
4422 GetSession()->SendPacket(&data);
4423
4424 // speed change, land walk
4425
4426 // remove death flag + set aura
4428 RemoveAurasDueToSpell(20584); // speed bonuses
4429 RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST
4430
4431 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
4433
4434 setDeathState(DeathState::Alive);
4437 SetWaterWalking(false);
4438 m_deathTimer = 0;
4439
4440 // set health/powers (0- will be set in caller)
4441 if (restore_percent > 0.0f)
4442 {
4443 SetHealth(uint32(GetMaxHealth()*restore_percent));
4444 SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent));
4445 SetPower(POWER_RAGE, 0);
4447 }
4448
4449 // trigger update zone for alive state zone updates
4450 uint32 newzone, newarea;
4451 GetZoneAndAreaId(newzone, newarea);
4452 UpdateZone(newzone, newarea);
4453 sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone);
4454
4455 if (Battleground* bg = GetBattleground())
4456 bg->HandlePlayerResurrect(this);
4457
4458 // update visibility
4460
4461 sScriptMgr->OnPlayerResurrect(this, restore_percent, applySickness);
4462
4463 if (!applySickness)
4464 {
4465 return;
4466 }
4467
4468 //Characters from level 1-10 are not affected by resurrection sickness.
4469 //Characters from level 11-19 will suffer from one minute of sickness
4470 //for each level they are above 10.
4471 //Characters level 20 and up suffer from ten minutes of sickness.
4472 int32 startLevel = sWorld->getIntConfig(CONFIG_DEATH_SICKNESS_LEVEL);
4473
4474 if (int32(GetLevel()) >= startLevel)
4475 {
4476 // set resurrection sickness
4477 CastSpell(this, 15007, true);
4478
4479 // not full duration
4480 if (int32(GetLevel()) < startLevel + 9)
4481 {
4482 int32 delta = (int32(GetLevel()) - startLevel + 1) * MINUTE;
4483
4484 if (Aura* aur = GetAura(15007, GetGUID()))
4485 {
4486 aur->SetDuration(delta * IN_MILLISECONDS);
4487 }
4488 }
4489 }
4490}
@ MOVE_LAND_WALK
Definition: Player.h:459
@ UNIT_BYTE1_FLAG_GROUND
Definition: UnitDefines.h:58
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition: IWorld.h:309
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition: Object.cpp:3157
void UpdateZone(uint32 newZone, uint32 newArea)
Definition: PlayerUpdates.cpp:1207
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: PlayerUpdates.cpp:1567

References Unit::CastSpell(), CONFIG_DEATH_SICKNESS_LEVEL, Unit::GetAura(), GetBattleground(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), GetSession(), WorldObject::GetZoneAndAreaId(), IN_MILLISECONDS, m_deathTimer, MINUTE, MOVE_LAND_WALK, MOVE_UNROOT, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasDueToSpell(), WorldSession::SendPacket(), Object::SetByteValue(), setDeathState(), Object::SetDynamicFlag(), Unit::SetHealth(), SetMovement(), Unit::SetPower(), SetWaterWalking(), SMSG_DEATH_RELEASE_LOC, sOutdoorPvPMgr, sScriptMgr, sWorld, UNIT_BYTE1_FLAG_GROUND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_BYTES_1, UpdateObjectVisibility(), and UpdateZone().

Referenced by Battleground::_ProcessResurrect(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), LoadFromDB(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ ResyncRunes()

void Player::ResyncRunes ( uint8  count)
13375{
13376 WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2);
13377 data << uint32(count);
13378 for (uint32 i = 0; i < count; ++i)
13379 {
13380 data << uint8(GetCurrentRune(i)); // rune type
13381 data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
13382 }
13383 GetSession()->SendPacket(&data);
13384}
@ SMSG_RESYNC_RUNES
Definition: Opcodes.h:1189
RuneType GetCurrentRune(uint8 index) const
Definition: Player.h:2483

References GetCurrentRune(), GetRuneCooldown(), GetSession(), WorldSession::SendPacket(), and SMSG_RESYNC_RUNES.

◆ RewardExtraBonusTalentPoints()

void Player::RewardExtraBonusTalentPoints ( uint32  bonusTalentPoints)

A talent point boost. Usage: 1). Hot update situation (occurred when character is online, like PlayerScript:OnAchiComplete): Right after calling this function, character can reward talent points by calling function player->InitTalentForLevel().

2). Data initing situation (like PlayerScript:OnLoadFromDB)

6010{
6011 if (bonusTalentPoints)
6012 {
6013 m_extraBonusTalentCount += bonusTalentPoints;
6014 }
6015}

References m_extraBonusTalentCount.

◆ RewardHonor()

bool Player::RewardHonor ( Unit uVictim,
uint32  groupsize,
int32  honor = -1,
bool  awardXP = true 
)

Calculate the amount of honor gained based on the victim and the size of the group for which the honor is divided An exact honor value can also be given (overriding the calcs)

6021{
6022 // do not reward honor in arenas, but enable onkill spellproc
6023 if (InArena())
6024 {
6025 if (!uVictim || uVictim == this || uVictim->GetTypeId() != TYPEID_PLAYER)
6026 return false;
6027
6028 if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId())
6029 return false;
6030
6031 return true;
6032 }
6033
6034 // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
6036 return false;
6037
6038 /* check if player has same IP
6039 if (uVictim && uVictim->IsPlayer())
6040 {
6041 if (GetSession()->GetRemoteAddress() == uVictim->ToPlayer()->GetSession()->GetRemoteAddress())
6042 return false;
6043 }
6044 */
6045
6046 ObjectGuid victim_guid;
6047 uint32 victim_rank = 0;
6048
6049 // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
6051
6052 // do not reward honor in arenas, but return true to enable onkill spellproc
6053 if (InArena())
6054 return true;
6055
6056 // Promote to float for calculations
6057 float honor_f = (float)honor;
6058
6059 if (honor_f <= 0)
6060 {
6061 if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
6062 return false;
6063
6064 victim_guid = uVictim->GetGUID();
6065
6066 if (uVictim->IsPlayer())
6067 {
6068 Player* victim = uVictim->ToPlayer();
6069
6070 if (GetTeamId() == victim->GetTeamId() && !sWorld->IsFFAPvPRealm())
6071 return false;
6072
6073 uint8 k_level = GetLevel();
6074 uint8 k_grey = Acore::XP::GetGrayLevel(k_level);
6075 uint8 v_level = victim->GetLevel();
6076
6077 if (v_level <= k_grey)
6078 return false;
6079
6080 // PLAYER_CHOSEN_TITLE VALUES DESCRIPTION
6081 // [0] Just name
6082 // [1..14] Alliance honor titles and player name
6083 // [15..28] Horde honor titles and player name
6084 // [29..38] Other title and player name
6085 // [39+] Nothing
6086 uint32 victim_title = victim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
6087 uint32 killer_title = 0;
6088 sScriptMgr->OnVictimRewardBefore(this, victim, killer_title, victim_title);
6089 // Get Killer titles, CharTitlesEntry::bit_index
6090 // Ranks:
6091 // title[1..14] -> rank[5..18]
6092 // title[15..28] -> rank[5..18]
6093 // title[other] -> 0
6094 if (victim_title == 0)
6095 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6096 else if (victim_title < 15)
6097 victim_rank = victim_title + 4;
6098 else if (victim_title < 29)
6099 victim_rank = victim_title - 14 + 4;
6100 else
6101 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6102
6103 honor_f = std::ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
6104
6105 // count the number of playerkills in one day
6107 // and those in a lifetime
6115 sScriptMgr->OnVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);
6116 }
6117 else
6118 {
6119 if (!uVictim->ToCreature()->IsRacialLeader())
6120 return false;
6121
6122 honor_f = 100.0f; // ??? need more info
6123 victim_rank = 19; // HK: Leader
6124 }
6125 }
6126
6127 if (uVictim)
6128 {
6129 if (groupsize > 1)
6130 honor_f /= groupsize;
6131
6132 // apply honor multiplier from aura (not stacking-get highest)
6134 }
6135
6136 honor_f *= sWorld->getRate(RATE_HONOR);
6137 // Back to int now
6138 honor = int32(honor_f);
6139 // honor - for show honor points in log
6140 // victim_guid - for show victim name in log
6141 // victim_rank [1..4] HK: <dishonored rank>
6142 // victim_rank [5..19] HK: <alliance\horde rank>
6143 // victim_rank [0, 20+] HK: <>
6144 WorldPacket data(SMSG_PVP_CREDIT, 4 + 8 + 4);
6145 data << honor;
6146 data << victim_guid;
6147 data << victim_rank;
6148
6149 // Xinef: non quest case, quest honor obtain is send in quest reward packet
6150 if (uVictim || groupsize > 0)
6151 GetSession()->SendPacket(&data);
6152
6153 // add honor points
6154 ModifyHonorPoints(honor);
6155
6157
6158 // Xinef: Battleground experience
6159 if (awardXP)
6160 if (Battleground* bg = GetBattleground())
6161 {
6162 bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping
6163 // Xinef: Only for BG activities
6164 if (!uVictim)
6165 {
6166 uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f));
6167 sScriptMgr->OnGivePlayerXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND);
6168 GiveXP(xp, nullptr);
6169 }
6170 }
6171
6172 if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE))
6173 {
6174 if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
6175 return true;
6176
6177 if (uVictim->IsPlayer())
6178 {
6179 // Check if allowed to receive it in current map
6181 if ((MapType == 1 && !InBattleground() && !IsFFAPvP())
6182 || (MapType == 2 && !IsFFAPvP())
6183 || (MapType == 3 && !InBattleground()))
6184 return true;
6185
6186 uint32 itemID = sWorld->getIntConfig(CONFIG_PVP_TOKEN_ID);
6187 int32 count = sWorld->getIntConfig(CONFIG_PVP_TOKEN_COUNT);
6188
6189 if (AddItem(itemID, count))
6190 ChatHandler(GetSession()).PSendSysMessage("You have been awarded a token for slaying another player.");
6191 }
6192 }
6193
6194 return true;
6195}
@ SPELL_AURA_MOD_HONOR_GAIN_PCT
Definition: SpellAuraDefines.h:344
@ SPELL_AURA_NO_PVP_CREDIT
Definition: SpellAuraDefines.h:222
@ SCORE_BONUS_HONOR
Definition: BattlegroundScore.h:32
@ SPELL_AURA_PLAYER_INACTIVE
Definition: Battleground.h:140
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition: IWorld.h:338
@ CONFIG_PVP_TOKEN_ID
Definition: IWorld.h:339
@ CONFIG_PVP_TOKEN_COUNT
Definition: IWorld.h:340
@ CONFIG_PVP_TOKEN_ENABLE
Definition: IWorld.h:134
@ RATE_HONOR
Definition: IWorld.h:509
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition: DBCEnums.h:219
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition: DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition: DBCEnums.h:167
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition: DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition: DBCEnums.h:182
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition: DBCEnums.h:166
@ SMSG_PVP_CREDIT
Definition: Opcodes.h:682
std::unordered_map< std::string, Player * > MapType
Definition: ObjectAccessor.cpp:88
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition: Formulas.h:31
bool IsRacialLeader() const
Definition: Creature.h:76
void Clear()
Definition: ObjectGuid.h:138
bool AddItem(uint32 itemId, uint32 count)
Definition: Player.cpp:15509
bool IsFFAPvP()
Definition: Player.cpp:16169
TeamId GetBgTeamId() const
Definition: Player.h:2254
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5886

References ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, AddItem(), AddPct(), Object::ApplyModUInt32Value(), ObjectGuid::Clear(), CONFIG_PVP_TOKEN_COUNT, CONFIG_PVP_TOKEN_ENABLE, CONFIG_PVP_TOKEN_ID, CONFIG_PVP_TOKEN_MAP_TYPE, WorldObject::GetAreaId(), GetBattleground(), GetBgTeamId(), Unit::getClass(), Acore::XP::GetGrayLevel(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxPositiveAuraModifier(), Unit::getRace(), GetSession(), GetTeamId(), Object::GetTypeId(), Object::GetUInt32Value(), GiveXP(), Unit::HasAura(), Unit::HasAuraType(), Acore::Honor::hk_honor_at_level_f(), InArena(), InBattleground(), IsFFAPvP(), Object::IsPlayer(), Creature::IsRacialLeader(), ModifyHonorPoints(), PLAYER_CHOSEN_TITLE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, ChatHandler::PSendSysMessage(), RATE_HONOR, SCORE_BONUS_HONOR, WorldSession::SendPacket(), SMSG_PVP_CREDIT, SPELL_AURA_MOD_HONOR_GAIN_PCT, SPELL_AURA_NO_PVP_CREDIT, SPELL_AURA_PLAYER_INACTIVE, sScriptMgr, sWorld, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, UpdateAchievementCriteria(), and UpdateHonorFields().

Referenced by KillRewarder::_RewardHonor(), DuelComplete(), Spell::EffectAddHonor(), OutdoorPvPSI::HandleAreaTrigger(), honor_commandscript::HandleHonorAddCommand(), honor_commandscript::HandleHonorAddKillCommand(), RewardQuest(), and Battleground::UpdatePlayerScore().

◆ RewardPlayerAndGroupAtEvent()

void Player::RewardPlayerAndGroupAtEvent ( uint32  creature_id,
WorldObject pRewardSource 
)
12682{
12683 if (!pRewardSource)
12684 return;
12685
12686 ObjectGuid creature_guid = (pRewardSource->GetTypeId() == TYPEID_UNIT) ? pRewardSource->GetGUID() : ObjectGuid::Empty;
12687
12688 // prepare data for near group iteration
12689 if (Group* group = GetGroup())
12690 {
12691 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12692 {
12693 Player* player = itr->GetSource();
12694 if (!player)
12695 continue;
12696
12697 if (!player->IsAtGroupRewardDistance(pRewardSource))
12698 continue; // member (alive or dead) or his corpse at req. distance
12699
12700 // quest objectives updated only for alive group member or dead but with not released body
12701 if (player->IsAlive() || !player->GetCorpse())
12702 player->KilledMonsterCredit(creature_id, creature_guid);
12703 }
12704 }
12705 else // if (!group)
12706 KilledMonsterCredit(creature_id, creature_guid);
12707}

References ObjectGuid::Empty, GetCorpse(), GetGroup(), Object::GetGUID(), Object::GetTypeId(), Unit::IsAlive(), IsAtGroupRewardDistance(), KilledMonsterCredit(), GroupReference::next(), and TYPEID_UNIT.

Referenced by Spell::EffectKillCredit(), spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), SmartScript::ProcessAction(), and SmartAI::StopFollow().

◆ RewardPlayerAndGroupAtKill()

void Player::RewardPlayerAndGroupAtKill ( Unit victim,
bool  isBattleGround 
)
12677{
12678 KillRewarder(this, victim, isBattleGround).Reward();
12679}
Definition: KillRewarder.h:28
void Reward()
Definition: KillRewarder.cpp:268

References KillRewarder::Reward().

Referenced by Unit::Kill(), and Battleground::RewardXPAtKill().

◆ RewardQuest()

void Player::RewardQuest ( Quest const *  quest,
uint32  reward,
Object questGiver,
bool  announce = true,
bool  isLFGReward = false 
)
659{
660 //this THING should be here to protect code from quest, which cast on player far teleport as a reward
661 //should work fine, cause far teleport will be executed in Player::Update()
663
664 uint32 quest_id = quest->GetQuestId();
665
666 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
667 {
668 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
669 {
670 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->RequiredItemId[i], quest_id, true))
671 DestroyItemCount(quest->RequiredItemId[i], 9999, true);
672 else
673 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
674 }
675 }
676 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
677 {
678 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
679 {
680 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->ItemDrop[i], quest_id))
681 DestroyItemCount(quest->ItemDrop[i], 9999, true);
682 else
683 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
684 }
685 }
686
687 RemoveTimedQuest(quest_id);
688
689 std::vector<std::pair<uint32, uint32>> problematicItems;
690
691 if (quest->GetRewChoiceItemsCount())
692 {
693 if (uint32 itemId = quest->RewardChoiceItemId[reward])
694 {
695 ItemPosCountVec dest;
696 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
697 {
698 Item* item = StoreNewItem(dest, itemId, true);
699 SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
700
701 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
702 }
703 else
704 {
705 problematicItems.emplace_back(itemId, quest->RewardChoiceItemCount[reward]);
706 }
707 }
708 }
709
710 if (quest->GetRewItemsCount())
711 {
712 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
713 {
714 if (uint32 itemId = quest->RewardItemId[i])
715 {
716 ItemPosCountVec dest;
717 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
718 {
719 Item* item = StoreNewItem(dest, itemId, true);
720 SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
721
722 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
723 }
724 else
725 problematicItems.emplace_back(itemId, quest->RewardItemIdCount[i]);
726 }
727 }
728 }
729
730 // Xinef: send items that couldn't be added properly by mail
731 if (!problematicItems.empty())
732 {
733 SendItemRetrievalMail(problematicItems);
734 }
735
736 RewardReputation(quest);
737
738 uint16 log_slot = FindQuestSlot(quest_id);
739 if (log_slot < MAX_QUEST_LOG_SIZE)
740 SetQuestSlot(log_slot, 0);
741
742 bool rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest();
743
744 // Not give XP in case already completed once repeatable quest
745 uint32 XP = rewarded ? 0 : CalculateQuestRewardXP(quest);
746
747 sScriptMgr->OnQuestComputeXP(this, quest, XP);
748 int32 moneyRew = 0;
749 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(this))
750 {
751 moneyRew = quest->GetRewMoneyMaxLevel();
752 }
753 else
754 {
755 sScriptMgr->OnGivePlayerXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST);
756 GiveXP(XP, nullptr, 1.0f, isLFGReward);
757 }
758
759 // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative
760 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(GetLevel()))
761 {
762 moneyRew += rewOrReqMoney;
763 }
764
765 if (moneyRew)
766 {
767 ModifyMoney(moneyRew);
768
769 if (moneyRew > 0)
771 }
772
773 // honor reward
774 if (uint32 honor = quest->CalculateHonorGain(GetLevel()))
775 RewardHonor(nullptr, 0, honor);
776
777 // title reward
778 if (quest->GetCharTitleId())
779 {
780 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
781 SetTitle(titleEntry);
782 }
783
784 if (quest->GetBonusTalents())
785 {
786 m_questRewardTalentCount += quest->GetBonusTalents();
788 }
789
790 if (quest->GetRewArenaPoints())
791 ModifyArenaPoints(quest->GetRewArenaPoints());
792
793 // Send reward mail
794 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
795 {
796 //- TODO: Poor design of mail system
797 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
798 if (quest->GetRewMailSenderEntry() != 0)
799 MailDraft(mail_template_id).SendMailTo(trans, this, quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
800 else
801 MailDraft(mail_template_id).SendMailTo(trans, this, questGiver, MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
802 CharacterDatabase.CommitTransaction(trans);
803 }
804
805 if (quest->IsDaily() || quest->IsDFQuest())
806 {
807 SetDailyQuestStatus(quest_id);
808 if (quest->IsDaily())
809 {
812 }
813 }
814 else if (quest->IsWeekly())
815 SetWeeklyQuestStatus(quest_id);
816 else if (quest->IsMonthly())
817 SetMonthlyQuestStatus(quest_id);
818 else if (quest->IsSeasonal())
819 SetSeasonalQuestStatus(quest_id);
820
821 RemoveActiveQuest(quest_id, false);
822 m_RewardedQuests.insert(quest_id);
823 m_RewardedQuestsSave[quest_id] = true;
824
825 if (announce)
826 SendQuestReward(quest, XP);
827
828 // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
829 if (quest->GetRewSpellCast() > 0)
830 {
831 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
832 if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
833 {
834 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
835 creature->CastSpell(this, quest->GetRewSpellCast(), true);
836 }
837 else
838 CastSpell(this, quest->GetRewSpellCast(), true);
839 }
840 else if (quest->GetRewSpell() > 0)
841 {
842 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
843 if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
844 {
845 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
846 creature->CastSpell(this, quest->GetRewSpell(), true);
847 }
848 else
849 CastSpell(this, quest->GetRewSpell(), true);
850 }
851
852 if (quest->GetZoneOrSort() > 0)
856
857 // pussywizard: replaced partial save with full save
858 SaveToDB(false, false);
859
860 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
861 {
864 }
865
866 SendQuestUpdate(quest_id);
867
869
870 //lets remove flag for delayed teleports
872
873 // Xinef: area auras may change on quest completion!
876
877 sScriptMgr->OnPlayerCompleteQuest(this, quest);
878}
@ MAIL_CHECK_MASK_HAS_BODY
Definition: Mail.h:52
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition: DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition: DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition: DBCEnums.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition: DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition: DBCEnums.h:175
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition: DBCEnums.h:141
@ SPELL_EFFECT_CREATE_ITEM
Definition: SharedDefines.h:802
bool isType(uint16 mask) const
Definition: Object.h:125
bool IsInHostileArea
Definition: Player.h:361
bool HasPvPForcingQuest() const
Definition: PlayerQuest.cpp:2489
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
Definition: PlayerQuest.cpp:2258
uint32 CalculateQuestRewardXP(Quest const *quest)
Definition: PlayerQuest.cpp:1396
void SetMonthlyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12100
void SetSeasonalQuestStatus(uint32 quest_id)
Definition: Player.cpp:12090
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition: PlayerMisc.cpp:439
void SendQuestReward(Quest const *quest, uint32 XP)
Definition: PlayerQuest.cpp:2351
void SetDailyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12042
void RewardReputation(Unit *victim)
Definition: Player.cpp:5905
void SetWeeklyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12084
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition: PlayerQuest.cpp:1489
void SetMustDelayTeleport(bool setting)
Definition: Player.h:2908
bool IsSelfCast() const
Definition: SpellInfo.cpp:1089

References ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, BIND_QUEST_ITEM, Quest::CalculateHonorGain(), CalculateQuestRewardXP(), CanStoreNewItem(), Unit::CastSpell(), CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, DestroyItemCount(), EQUIP_ERR_OK, FindQuestSlot(), WorldObject::GetAreaId(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), Quest::GetQuestId(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMailDelaySecs(), Quest::GetRewMailSenderEntry(), Quest::GetRewMailTemplateId(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), GiveXP(), SpellInfo::HasEffect(), Quest::HasFlag(), HasPvPForcingQuest(), HasQuestForItem(), InitTalentForLevel(), Quest::IsDaily(), Quest::IsDFQuest(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, Quest::IsMonthly(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), SpellInfo::IsSelfCast(), Object::isType(), Quest::IsWeekly(), Quest::ItemDrop, Quest::ItemDropQuantity, m_questRewardTalentCount, m_RewardedQuests, m_RewardedQuestsSave, MAIL_CHECK_MASK_HAS_BODY, MAX_QUEST_LOG_SIZE, ModifyArenaPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, RemoveActiveQuest(), RemoveTimedQuest(), Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, RewardHonor(), Quest::RewardItemId, Quest::RewardItemIdCount, RewardReputation(), SaveToDB(), sCharTitlesStore, SendItemRetrievalMail(), MailDraft::SendMailTo(), SendNewItem(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestUpdate(), SetDailyQuestStatus(), SetMonthlyQuestStatus(), SetMustDelayTeleport(), SetQuestSlot(), SetSeasonalQuestStatus(), SetTitle(), SetWeeklyQuestStatus(), sObjectMgr, SPELL_EFFECT_CREATE_ITEM, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, StoreNewItem(), sWorld, TYPEMASK_UNIT, UpdateAchievementCriteria(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by CompleteQuest(), lfg::LFGMgr::FinishDungeon(), and WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ RewardReputation() [1/2]

void Player::RewardReputation ( Quest const *  quest)
5956{
5957 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
5958 {
5959 if (!quest->RewardFactionId[i])
5960 continue;
5961
5962 float rep = 0.f;
5963
5964 if (quest->RewardFactionValueIdOverride[i])
5965 {
5966 rep = quest->RewardFactionValueIdOverride[i] / 100.f;
5967 }
5968 else
5969 {
5970 uint32 row = ((quest->RewardFactionValueId[i] < 0) ? 1 : 0) + 1;
5971 if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row))
5972 {
5973 uint32 field = std::abs(quest->RewardFactionValueId[i]);
5974 rep = static_cast<float>(questFactionRewEntry->QuestRewFactionValue[field]);
5975 }
5976 }
5977
5978 if (rep == 0.f)
5979 continue;
5980
5981 if (quest->IsDaily())
5982 {
5983 rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5984 }
5985 else if (quest->IsWeekly())
5986 {
5987 rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5988 }
5989 else if (quest->IsMonthly())
5990 {
5991 rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5992 }
5993 else if (quest->IsRepeatable())
5994 {
5995 rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5996 }
5997 else
5998 {
5999 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6000 }
6001
6002 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i]))
6003 {
6004 GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER));
6005 }
6006 }
6007}
DBCStorage< QuestFactionRewEntry > sQuestFactionRewardStore(QuestFactionRewardfmt)
#define QUEST_REPUTATIONS_COUNT
Definition: QuestDef.h:41
@ QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER
Definition: QuestDef.h:166
float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
Definition: Player.cpp:5825
bool ModifyReputation(FactionEntry const *factionEntry, float standing, bool noSpillOver=false, Optional< ReputationRank > repMaxCap={})
Definition: ReputationMgr.h:118
Definition: DBCStructure.h:1458

References CalculateReputationGain(), GetQuestLevel(), GetReputationMgr(), Quest::HasSpecialFlag(), Quest::IsDaily(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), ReputationMgr::ModifyReputation(), QUEST_REPUTATIONS_COUNT, QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_WEEKLY_QUEST, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, sFactionStore, and sQuestFactionRewardStore.

◆ RewardReputation() [2/2]

void Player::RewardReputation ( Unit victim)
5906{
5907 if (!victim || victim->IsPlayer())
5908 return;
5909
5910 if (victim->ToCreature()->IsReputationGainDisabled())
5911 return;
5912
5913 ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry);
5914 if (!Rep)
5915 return;
5916
5917 uint32 ChampioningFaction = 0;
5918
5920 {
5921 // support for: Championing - http://www.wowwiki.com/Championing
5922 Map const* map = GetMap();
5923 if (map->IsNonRaidDungeon())
5924 if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty()))
5925 if (dungeon->TargetLevel == 80)
5926 ChampioningFaction = GetChampioningFaction();
5927 }
5928
5929 TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding
5930
5931 if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE))
5932 {
5933 float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5934
5935 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5936 if (factionEntry1)
5937 {
5938 GetReputationMgr().ModifyReputation(factionEntry1, donerep1, false, static_cast<ReputationRank>(Rep->ReputationMaxCap1));
5939 }
5940 }
5941
5942 if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE))
5943 {
5944 float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
5945
5946 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
5947 if (factionEntry2)
5948 {
5949 GetReputationMgr().ModifyReputation(factionEntry2, donerep2, false, static_cast<ReputationRank>(Rep->ReputationMaxCap2));
5950 }
5951 }
5952}
LFGDungeonEntry const * GetLFGDungeon(uint32 mapId, Difficulty difficulty)
Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple ...
Definition: DBCStores.cpp:852
TeamId
Definition: SharedDefines.h:759
bool IsReputationGainDisabled() const
Definition: Creature.h:361
uint32 Entry
Definition: CreatureData.h:190
uint32 GetChampioningFaction() const
Definition: Player.h:2526
Definition: ObjectMgr.h:568
uint32 ReputationMaxCap1
Definition: ObjectMgr.h:571
float RepValue1
Definition: ObjectMgr.h:572
uint32 RepFaction1
Definition: ObjectMgr.h:569
uint32 RepFaction2
Definition: ObjectMgr.h:570
bool TeamDependent
Definition: ObjectMgr.h:577
float RepValue2
Definition: ObjectMgr.h:574
uint32 ReputationMaxCap2
Definition: ObjectMgr.h:573
bool IsNonRaidDungeon() const
Definition: Map.h:449
Definition: DBCStructure.h:1245

References CalculateReputationGain(), CreatureTemplate::Entry, GetChampioningFaction(), Creature::GetCreatureTemplate(), Map::GetDifficulty(), Map::GetId(), Unit::GetLevel(), GetLFGDungeon(), WorldObject::GetMap(), GetReputationMgr(), GetTeamId(), Map::IsNonRaidDungeon(), Object::IsPlayer(), Creature::IsReputationGainDisabled(), ReputationMgr::ModifyReputation(), ReputationOnKillEntry::RepFaction1, ReputationOnKillEntry::RepFaction2, REPUTATION_SOURCE_KILL, ReputationOnKillEntry::ReputationMaxCap1, ReputationOnKillEntry::ReputationMaxCap2, ReputationOnKillEntry::RepValue1, ReputationOnKillEntry::RepValue2, sFactionStore, sObjectMgr, TEAM_ALLIANCE, TEAM_HORDE, ReputationOnKillEntry::TeamDependent, and Object::ToCreature().

Referenced by KillRewarder::_RewardReputation(), and RewardQuest().

◆ Satisfy()

bool Player::Satisfy ( DungeonProgressionRequirements const *  ar,
uint32  target_map,
bool  report = false 
)
6721{
6722 if (!IsGameMaster() && ar)
6723 {
6724 uint8 LevelMin = 0;
6725 uint8 LevelMax = 0;
6726
6727 MapEntry const* mapEntry = sMapStore.LookupEntry(target_map);
6728 if (!mapEntry)
6729 return false;
6730
6731 if (!sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_LEVEL))
6732 {
6733 if (ar->levelMin && GetLevel() < ar->levelMin)
6734 LevelMin = ar->levelMin;
6735 if (ar->levelMax && GetLevel() > ar->levelMax)
6736 LevelMax = ar->levelMax;
6737 }
6738
6739 if (DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, target_map, this))
6740 {
6742 return false;
6743 }
6744
6745 Player* partyLeader = this;
6746 std::string leaderName = m_session->GetAcoreString(LANG_YOU);
6747 {
6748 ObjectGuid leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
6749 Player* tempLeader = HashMapHolder<Player>::Find(leaderGuid);
6750 if (leaderGuid != GetGUID())
6751 {
6752 if (tempLeader != nullptr)
6753 {
6754 partyLeader = tempLeader;
6755 }
6756 leaderName = GetGroup()->GetLeaderName();
6757 }
6758 }
6759
6760 //Check all items
6761 std::vector<const ProgressionRequirement*> missingPlayerItems;
6762 std::vector<const ProgressionRequirement*> missingLeaderItems;
6763 for (const ProgressionRequirement* itemRequirement : ar->items)
6764 {
6765 Player* checkPlayer = this;
6766 std::vector<const ProgressionRequirement*>* missingItems = &missingPlayerItems;
6767 if (itemRequirement->checkLeaderOnly)
6768 {
6769 checkPlayer = partyLeader;
6770 missingItems = &missingLeaderItems;
6771 }
6772
6773 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true))
6774 {
6775 if (!checkPlayer->HasItemCount(itemRequirement->id, 1))
6776 {
6777 missingItems->push_back(itemRequirement);
6778 }
6779 }
6780 }
6781
6782 //Check all achievements
6783 std::vector<const ProgressionRequirement*> missingPlayerAchievements;
6784 std::vector<const ProgressionRequirement*> missingLeaderAchievements;
6785 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
6786 {
6787 Player* checkPlayer = this;
6788 std::vector<const ProgressionRequirement*>* missingAchievements = &missingPlayerAchievements;
6789 if (achievementRequirement->checkLeaderOnly)
6790 {
6791 checkPlayer = partyLeader;
6792 missingAchievements = &missingLeaderAchievements;
6793 }
6794
6795 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true))
6796 {
6797 if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id))
6798 {
6799 missingAchievements->push_back(achievementRequirement);
6800 }
6801 }
6802 }
6803
6804 //Check all quests
6805 std::vector<const ProgressionRequirement*> missingPlayerQuests;
6806 std::vector<const ProgressionRequirement*> missingLeaderQuests;
6807 for (const ProgressionRequirement* questRequirement : ar->quests)
6808 {
6809 Player* checkPlayer = this;
6810 std::vector<const ProgressionRequirement*>* missingQuests = &missingPlayerQuests;
6811 if (questRequirement->checkLeaderOnly)
6812 {
6813 checkPlayer = partyLeader;
6814 missingQuests = &missingLeaderQuests;
6815 }
6816
6817 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true))
6818 {
6819 if (!checkPlayer->GetQuestRewardStatus(questRequirement->id))
6820 {
6821 missingQuests->push_back(questRequirement);
6822 }
6823 }
6824 }
6825
6826 //Check if avg ILVL requirement is allowed
6827 bool ilvlRequirementNotMet = false;
6829 {
6830 const int32 currentIlvl = (int32)GetAverageItemLevelForDF();
6831 if (ar->reqItemLevel > currentIlvl)
6832 {
6833 ilvlRequirementNotMet = true;
6834 }
6835 }
6836
6837 Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
6838 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
6839 if (LevelMin || LevelMax || ilvlRequirementNotMet
6840 || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size()
6841 || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size())
6842 {
6843 if (!sScriptMgr->NotAvoidSatisfy(partyLeader, ar, target_map, report))
6844 return true;
6845
6846 if (report)
6847 {
6848 uint8 requirementPrintMode = sWorld->getIntConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE);
6849
6850 if (requirementPrintMode == 0)
6851 {
6852 //Just print out the requirements are not met
6854 }
6855 else if (requirementPrintMode == 1)
6856 {
6857 //Blizzlike method of printing out the requirements
6858 if (missingPlayerQuests.size() && !missingPlayerQuests[0]->note.empty())
6859 {
6860 ChatHandler(GetSession()).PSendSysMessage("{}", missingPlayerQuests[0]->note);
6861 }
6862 else if (missingLeaderQuests.size() && !missingLeaderQuests[0]->note.empty())
6863 {
6864 ChatHandler(GetSession()).PSendSysMessage("{}", missingLeaderQuests[0]->note);
6865 }
6866 else if (mapDiff->hasErrorMessage)
6867 {
6868 // if (missingAchievement) covered by this case
6869 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6870 }
6871 else if (missingPlayerItems.size())
6872 {
6874 std::string name = sObjectMgr->GetItemTemplate(missingPlayerItems[0]->id)->Name1;
6875 if (ItemLocale const* il = sObjectMgr->GetItemLocale(missingPlayerItems[0]->id))
6876 {
6877 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6878 }
6880 }
6881 else if (LevelMin)
6882 {
6884 }
6885 else if (ilvlRequirementNotMet)
6886 {
6888 }
6889 }
6890 else
6891 {
6892 bool errorAlreadyPrinted = false;
6893 //Pretty way of printing out requirements
6894 if (missingPlayerQuests.size())
6895 {
6897 PrettyPrintRequirementsQuestList(missingPlayerQuests);
6898 errorAlreadyPrinted = true;
6899 }
6900 if (missingLeaderQuests.size())
6901 {
6903 PrettyPrintRequirementsQuestList(missingLeaderQuests);
6904 errorAlreadyPrinted = true;
6905 }
6906
6907 if (missingPlayerAchievements.size())
6908 {
6910 PrettyPrintRequirementsAchievementsList(missingPlayerAchievements);
6911 errorAlreadyPrinted = true;
6912 }
6913 if (missingLeaderAchievements.size())
6914 {
6916 PrettyPrintRequirementsAchievementsList(missingLeaderAchievements);
6917 errorAlreadyPrinted = true;
6918 }
6919
6920 if (missingPlayerItems.size())
6921 {
6923 PrettyPrintRequirementsItemsList(missingPlayerItems);
6924 errorAlreadyPrinted = true;
6925 }
6926
6927 if (missingLeaderItems.size())
6928 {
6930 PrettyPrintRequirementsItemsList(missingLeaderItems);
6931 errorAlreadyPrinted = true;
6932 }
6933
6934 if (ilvlRequirementNotMet)
6935 {
6937 }
6938
6939 if (LevelMin)
6940 {
6942 }
6943 else if (LevelMax)
6944 {
6946 }
6947 else if (mapDiff->hasErrorMessage && !errorAlreadyPrinted)
6948 {
6949 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6950 }
6951 }
6952
6953 //Print the extra string
6955 if (optionalStringID > 0)
6956 {
6957 ChatHandler(GetSession()).SendSysMessage(optionalStringID);
6958 }
6959 }
6960 return false;
6961 }
6962 }
6963 return true;
6964}
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition: DBCStores.cpp:767
@ TRANSFER_ABORT_DIFFICULTY
Definition: Player.h:790
@ DISABLE_TYPE_MAP
Definition: DisableMgr.h:31
@ LANG_INSTANCE_CLOSED
Definition: Language.h:1054
@ LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS
Definition: Language.h:851
@ LANG_YOU
Definition: Language.h:76
@ LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET
Definition: Language.h:847
@ LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS
Definition: Language.h:844
@ LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS
Definition: Language.h:842
@ LANG_ACCESS_REQUIREMENT_NOT_MET
Definition: Language.h:846
@ LANG_LEVEL_MINREQUIRED_AND_ITEM
Definition: Language.h:82
@ LANG_ACCESS_REQUIREMENT_MAX_LEVEL
Definition: Language.h:848
@ LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS
Definition: Language.h:843
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS
Definition: Language.h:849
@ LANG_LEVEL_MINREQUIRED
Definition: Language.h:81
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS
Definition: Language.h:850
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID
Definition: IWorld.h:405
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE
Definition: IWorld.h:404
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL
Definition: IWorld.h:170
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition: IWorld.h:89
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:162
TeamId faction
Definition: Player.h:934
uint32 id
Definition: Player.h:933
bool checkLeaderOnly
Definition: Player.h:937
float GetAverageItemLevelForDF()
Definition: Player.cpp:15693
void PrettyPrintRequirementsQuestList(const std::vector< const ProgressionRequirement * > &missingQuests) const
Definition: PlayerStorage.cpp:6612
void PrettyPrintRequirementsItemsList(const std::vector< const ProgressionRequirement * > &missingItems) const
Definition: PlayerStorage.cpp:6682
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition: Player.cpp:11669
void PrettyPrintRequirementsAchievementsList(const std::vector< const ProgressionRequirement * > &missingAchievements) const
Definition: PlayerStorage.cpp:6649
const char * GetLeaderName() const
Definition: Group.cpp:2311
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:2296
void SendAreaTriggerMessage(const char *Text,...) ATTR_PRINTF(2
Definition: MiscHandler.cpp:691
Definition: DBCStructure.h:2222
bool hasErrorMessage
Definition: DBCStructure.h:2228

References DungeonProgressionRequirements::achievements, ProgressionRequirement::checkLeaderOnly, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE, CONFIG_INSTANCE_IGNORE_LEVEL, DISABLE_TYPE_MAP, ProgressionRequirement::faction, HashMapHolder< T >::Find(), WorldSession::GetAcoreString(), GetAverageItemLevelForDF(), GetDifficulty(), GetDownscaledMapDifficultyData(), GetGroup(), Object::GetGUID(), Group::GetLeaderGUID(), Group::GetLeaderName(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), GetQuestRewardStatus(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetTeamId(), HasAchieved(), MapDifficulty::hasErrorMessage, HasItemCount(), ProgressionRequirement::id, DisableMgr::IsDisabledFor(), IsGameMaster(), MapEntry::IsRaid(), DungeonProgressionRequirements::items, LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET, LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS, LANG_ACCESS_REQUIREMENT_MAX_LEVEL, LANG_ACCESS_REQUIREMENT_NOT_MET, LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS, LANG_INSTANCE_CLOSED, LANG_LEVEL_MINREQUIRED, LANG_LEVEL_MINREQUIRED_AND_ITEM, LANG_YOU, DungeonProgressionRequirements::levelMax, DungeonProgressionRequirements::levelMin, m_session, PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ChatHandler::PSendSysMessage(), DungeonProgressionRequirements::quests, DungeonProgressionRequirements::reqItemLevel, WorldSession::SendAreaTriggerMessage(), ChatHandler::SendSysMessage(), SendTransferAborted(), sMapStore, sObjectMgr, sScriptMgr, sWorld, TEAM_NEUTRAL, and TRANSFER_ABORT_DIFFICULTY.

Referenced by Spell::CheckCast(), WorldSession::HandleSetRaidDifficultyOpcode(), and MapMgr::PlayerCannotEnter().

◆ SatisfyQuestClass()

bool Player::SatisfyQuestClass ( Quest const *  qInfo,
bool  msg 
) const
1080{
1081 uint32 reqClass = qInfo->GetRequiredClasses();
1082
1083 if (reqClass == 0)
1084 return true;
1085
1086 if ((reqClass & getClassMask()) == 0)
1087 {
1088 if (msg)
1090
1091 return false;
1092 }
1093
1094 return true;
1095}
@ INVALIDREASON_DONT_HAVE_REQ
Definition: QuestDef.h:48
void SendCanTakeQuestResponse(uint32 msg) const
Definition: PlayerQuest.cpp:2399

References Unit::getClassMask(), Quest::GetRequiredClasses(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestConditions()

bool Player::SatisfyQuestConditions ( Quest const *  qInfo,
bool  msg 
)
1154{
1155 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId());
1156 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1157 {
1158 if (msg)
1160 LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest {}", qInfo->GetQuestId());
1161 return false;
1162 }
1163 return true;
1164}

References CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, Quest::GetQuestId(), INVALIDREASON_DONT_HAVE_REQ, LOG_DEBUG, sConditionMgr, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestDay()

bool Player::SatisfyQuestDay ( Quest const *  qInfo,
bool  msg 
) const
1263{
1264 if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
1265 return true;
1266
1267 if (qInfo->IsDFQuest())
1268 {
1269 if (!m_DFQuests.empty())
1270 return false;
1271
1272 return true;
1273 }
1274
1275 bool have_slot = false;
1276 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
1277 {
1278 uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx);
1279 if (qInfo->GetQuestId() == id)
1280 return false;
1281
1282 if (!id)
1283 have_slot = true;
1284 }
1285
1286 if (!have_slot)
1287 {
1288 if (msg)
1290 return false;
1291 }
1292
1293 return true;
1294}
@ INVALIDREASON_DAILY_QUESTS_REMAINING
Definition: QuestDef.h:58

References Quest::GetQuestId(), Object::GetUInt32Value(), INVALIDREASON_DAILY_QUESTS_REMAINING, Quest::IsDaily(), Quest::IsDFQuest(), m_DFQuests, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and SendCanTakeQuestResponse().

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SatisfyQuestExclusiveGroup()

bool Player::SatisfyQuestExclusiveGroup ( Quest const *  qInfo,
bool  msg 
) const
1178{
1179 // non positive exclusive group, if > 0 then can be start if any other quest in exclusive group already started/completed
1180 if (qInfo->GetExclusiveGroup() <= 0)
1181 return true;
1182
1183 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
1184
1185 for (; range.first != range.second; ++range.first)
1186 {
1187 uint32 exclude_Id = range.first->second;
1188
1189 // skip checked quest id, only state of other quests in group is interesting
1190 if (exclude_Id == qInfo->GetQuestId())
1191 continue;
1192
1193 // not allow have daily quest if daily quest from exclusive group already recently completed
1194 Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
1195 if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
1196 {
1197 if (msg)
1199
1200 return false;
1201 }
1202
1203 // alternative quest already started or completed - but don't check rewarded states if both are repeatable
1204 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && !Nquest->IsSeasonal() && IsQuestRewarded(exclude_Id))) // pussywizard: added !Nquest->IsSeasonal() because seasonal quests are considered rewarded only if finished this year, this is checked above in SatisfyQuestSeasonal
1205 {
1206 if (msg)
1208 return false;
1209 }
1210 }
1211 return true;
1212}
std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
Definition: ObjectMgr.h:1131

References Quest::GetExclusiveGroup(), Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QUEST_STATUS_NONE, SatisfyQuestDay(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestLevel()

bool Player::SatisfyQuestLevel ( Quest const *  qInfo,
bool  msg 
) const
962{
963 if (GetLevel() < qInfo->GetMinLevel())
964 {
965 if (msg)
967 return false;
968 }
969 else if (qInfo->GetMaxLevel() > 0 && GetLevel() > qInfo->GetMaxLevel())
970 {
971 if (msg)
972 SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
973 return false;
974 }
975 return true;
976}
@ INVALIDREASON_QUEST_FAILED_LOW_LEVEL
Definition: QuestDef.h:49

References Unit::GetLevel(), Quest::GetMaxLevel(), Quest::GetMinLevel(), INVALIDREASON_DONT_HAVE_REQ, INVALIDREASON_QUEST_FAILED_LOW_LEVEL, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), npc_wg_quest_giver::GetDialogStatus(), and GetQuestDialogStatus().

◆ SatisfyQuestLog()

bool Player::SatisfyQuestLog ( bool  msg)
979{
980 // exist free slot
982 return true;
983
984 if (msg)
985 {
987 GetSession()->SendPacket(&data);
988 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
989 }
990 return false;
991}
@ SMSG_QUESTLOG_FULL
Definition: Opcodes.h:435

References FindQuestSlot(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, WorldSession::SendPacket(), and SMSG_QUESTLOG_FULL.

Referenced by CanAddQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestMonth()

bool Player::SatisfyQuestMonth ( Quest const *  qInfo,
bool  msg 
) const
1321{
1322 if (!qInfo->IsMonthly() || m_monthlyquests.empty())
1323 return true;
1324
1325 // if not found in cooldown list
1326 return m_monthlyquests.find(qInfo->GetQuestId()) == m_monthlyquests.end();
1327}

References Quest::GetQuestId(), Quest::IsMonthly(), and m_monthlyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestNextChain()

bool Player::SatisfyQuestNextChain ( Quest const *  qInfo,
bool  msg 
) const
1215{
1216 uint32 nextQuest = qInfo->GetNextQuestInChain();
1217 if (!nextQuest)
1218 return true;
1219
1220 // next quest in chain already started or completed
1221 if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
1222 {
1223 if (msg)
1225 return false;
1226 }
1227
1228 // check for all quests further up the chain
1229 // only necessary if there are quest chains with more than one quest that can be skipped
1230 //return SatisfyQuestNextChain(qInfo->GetNextQuestInChain(), msg);
1231 return true;
1232}

References Quest::GetNextQuestInChain(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPrevChain()

bool Player::SatisfyQuestPrevChain ( Quest const *  qInfo,
bool  msg 
) const
1235{
1236 // No previous quest in chain
1237 if (qInfo->prevChainQuests.empty())
1238 return true;
1239
1240 for (Quest::PrevChainQuests::const_iterator iter = qInfo->prevChainQuests.begin(); iter != qInfo->prevChainQuests.end(); ++iter)
1241 {
1242 QuestStatusMap::const_iterator itr = m_QuestStatus.find(*iter);
1243
1244 // If any of the previous quests in chain active, return false
1245 if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
1246 {
1247 if (msg)
1249 return false;
1250 }
1251
1252 // check for all quests further down the chain
1253 // only necessary if there are quest chains with more than one quest that can be skipped
1254 //if (!SatisfyQuestPrevChain(prevId, msg))
1255 // return false;
1256 }
1257
1258 // No previous quest in chain active
1259 return true;
1260}

References INVALIDREASON_DONT_HAVE_REQ, m_QuestStatus, Quest::prevChainQuests, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPreviousQuest()

bool Player::SatisfyQuestPreviousQuest ( Quest const *  qInfo,
bool  msg 
) const
994{
995 // No previous quest (might be first quest in a series)
996 if (qInfo->prevQuests.empty())
997 return true;
998
999 for (Quest::PrevQuests::const_iterator iter = qInfo->prevQuests.begin(); iter != qInfo->prevQuests.end(); ++iter)
1000 {
1001 uint32 prevId = std::abs(*iter);
1002
1003 Quest const* qPrevInfo = sObjectMgr->GetQuestTemplate(prevId);
1004
1005 if (qPrevInfo)
1006 {
1007 // If any of the positive previous quests completed, return true
1008 if (*iter > 0 && IsQuestRewarded(prevId) && (!qPrevInfo->IsSeasonal() || !SatisfyQuestSeasonal(qPrevInfo, false)))
1009 {
1010 // skip one-from-all exclusive group
1011 if (qPrevInfo->GetExclusiveGroup() >= 0)
1012 return true;
1013
1014 // each-from-all exclusive group (< 0)
1015 // can be start if only all quests in prev quest exclusive group completed and rewarded
1016 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1017
1018 for (; range.first != range.second; ++range.first)
1019 {
1020 uint32 exclude_Id = range.first->second;
1021
1022 // skip checked quest id, only state of other quests in group is interesting
1023 if (exclude_Id == prevId)
1024 continue;
1025
1026 // alternative quest from group also must be completed and rewarded(reported)
1027
1028 Quest const* qExcludeInfo = sObjectMgr->GetQuestTemplate(exclude_Id);
1029 if (!IsQuestRewarded(exclude_Id) || (qExcludeInfo->IsSeasonal() && SatisfyQuestSeasonal(qExcludeInfo, false)))
1030 {
1031 if (msg)
1033 return false;
1034 }
1035 }
1036 return true;
1037 }
1038
1039 // If any of the negative previous quests active, return true
1040 if (*iter < 0 && GetQuestStatus(prevId) != QUEST_STATUS_NONE)
1041 {
1042 // skip one-from-all exclusive group
1043 if (qPrevInfo->GetExclusiveGroup() >= 0)
1044 return true;
1045
1046 // each-from-all exclusive group (< 0)
1047 // can be start if only all quests in prev quest exclusive group active
1048 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1049
1050 for (; range.first != range.second; ++range.first)
1051 {
1052 uint32 exclude_Id = range.first->second;
1053
1054 // skip checked quest id, only state of other quests in group is interesting
1055 if (exclude_Id == prevId)
1056 continue;
1057
1058 // alternative quest from group also must be active
1059 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
1060 {
1061 if (msg)
1063 return false;
1064 }
1065 }
1066 return true;
1067 }
1068 }
1069 }
1070
1071 // Has only positive prev. quests in non-rewarded state
1072 // and negative prev. quests in non-active state
1073 if (msg)
1075
1076 return false;
1077}
int32 GetExclusiveGroup() const
Definition: QuestDef.h:250

References Quest::GetExclusiveGroup(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsSeasonal(), Quest::prevQuests, QUEST_STATUS_NONE, SatisfyQuestSeasonal(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestRace()

bool Player::SatisfyQuestRace ( Quest const *  qInfo,
bool  msg 
) const
1098{
1099 uint32 reqraces = qInfo->GetAllowableRaces();
1100 if (reqraces == 0)
1101 return true;
1102 if ((reqraces & getRaceMask()) == 0)
1103 {
1104 if (msg)
1106 return false;
1107 }
1108 return true;
1109}
@ INVALIDREASON_QUEST_FAILED_WRONG_RACE
Definition: QuestDef.h:50

References Quest::GetAllowableRaces(), Unit::getRaceMask(), INVALIDREASON_QUEST_FAILED_WRONG_RACE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestReputation()

bool Player::SatisfyQuestReputation ( Quest const *  qInfo,
bool  msg 
) const
1112{
1113 uint32 fIdMin = qInfo->GetRequiredMinRepFaction(); //Min required rep
1114 if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
1115 {
1116 if (msg)
1118 return false;
1119 }
1120
1121 uint32 fIdMax = qInfo->GetRequiredMaxRepFaction(); //Max required rep
1122 if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
1123 {
1124 if (msg)
1126 return false;
1127 }
1128
1129 // ReputationObjective2 does not seem to be an objective requirement but a requirement
1130 // to be able to accept the quest
1131 uint32 fIdObj = qInfo->GetRepObjectiveFaction2();
1132 if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
1133 {
1134 if (msg)
1136 return false;
1137 }
1138
1139 return true;
1140}

References Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue2(), GetReputation(), GetReputationMgr(), Quest::GetRequiredMaxRepFaction(), Quest::GetRequiredMaxRepValue(), Quest::GetRequiredMinRepFaction(), Quest::GetRequiredMinRepValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestSeasonal()

bool Player::SatisfyQuestSeasonal ( Quest const *  qInfo,
bool  msg 
) const
1306{
1307 if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
1308 return true;
1309
1310 // cppcheck-suppress mismatchingContainers
1311 Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
1312
1313 if (itr == m_seasonalquests.end() || itr->second.empty())
1314 return true;
1315
1316 // if not found in cooldown list
1317 return itr->second.find(qInfo->GetQuestId()) == itr->second.end();
1318}

References Quest::GetEventIdForQuest(), Quest::GetQuestId(), Quest::IsSeasonal(), and m_seasonalquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), GetQuestRewardStatus(), GetQuestStatus(), SatisfyQuestExclusiveGroup(), and SatisfyQuestPreviousQuest().

◆ SatisfyQuestSkill()

bool Player::SatisfyQuestSkill ( Quest const *  qInfo,
bool  msg 
) const
942{
943 uint32 skill = qInfo->GetRequiredSkill();
944
945 // skip 0 case RequiredSkill
946 if (skill == 0)
947 return true;
948
949 // check skill value
950 if (GetBaseSkillValue(skill) < qInfo->GetRequiredSkillValue())
951 {
952 if (msg)
954
955 return false;
956 }
957
958 return true;
959}

References GetBaseSkillValue(), Quest::GetRequiredSkill(), Quest::GetRequiredSkillValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestStatus()

bool Player::SatisfyQuestStatus ( Quest const *  qInfo,
bool  msg 
) const
1143{
1144 if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
1145 {
1146 if (msg)
1148 return false;
1149 }
1150 return true;
1151}
@ INVALIDREASON_QUEST_ALREADY_ON
Definition: QuestDef.h:53

References Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_QUEST_ALREADY_ON, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestTimed()

bool Player::SatisfyQuestTimed ( Quest const *  qInfo,
bool  msg 
) const
1167{
1168 if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
1169 {
1170 if (msg)
1172 return false;
1173 }
1174 return true;
1175}
@ INVALIDREASON_QUEST_ONLY_ONE_TIMED
Definition: QuestDef.h:52

References Quest::HasSpecialFlag(), INVALIDREASON_QUEST_ONLY_ONE_TIMED, m_timedquests, QUEST_SPECIAL_FLAGS_TIMED, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestWeek()

bool Player::SatisfyQuestWeek ( Quest const *  qInfo,
bool  msg 
) const
1297{
1298 if (!qInfo->IsWeekly() || m_weeklyquests.empty())
1299 return true;
1300
1301 // if not found in cooldown list
1302 return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
1303}

References Quest::GetQuestId(), Quest::IsWeekly(), and m_weeklyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SaveGoldToDB()

void Player::SaveGoldToDB ( CharacterDatabaseTransaction  trans)
7142{
7144 stmt->SetData(0, GetMoney());
7145 stmt->SetData(1, GetGUID().GetCounter());
7146 trans->Append(stmt);
7147}
@ CHAR_UDP_CHAR_MONEY
Definition: CharacterDatabase.h:424

References CHAR_UDP_CHAR_MONEY, CharacterDatabase, Object::GetGUID(), GetMoney(), and PreparedStatementBase::SetData().

Referenced by WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), and SaveInventoryAndGoldToDB().

◆ SaveHealthBeforeDuel()

void Player::SaveHealthBeforeDuel ( )
inline

◆ SaveInventoryAndGoldToDB()

void Player::SaveInventoryAndGoldToDB ( CharacterDatabaseTransaction  trans)
7136{
7137 _SaveInventory(trans);
7138 SaveGoldToDB(trans);
7139}
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7141
void _SaveInventory(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7255

References _SaveInventory(), and SaveGoldToDB().

Referenced by WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleMailTakeItem(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSendMail(), WorldSession::HandleWrapItemOpcode(), and RefundItem().

◆ SaveManaBeforeDuel()

void Player::SaveManaBeforeDuel ( )
inline

◆ SavePositionInDB() [1/2]

void Player::SavePositionInDB ( uint32  mapid,
float  x,
float  y,
float  z,
float  o,
uint32  zone,
ObjectGuid  guid 
)
static

◆ SavePositionInDB() [2/2]

void Player::SavePositionInDB ( WorldLocation const &  loc,
uint16  zoneId,
ObjectGuid  guid,
CharacterDatabaseTransaction  trans 
)
static
100{
102
103 stmt->SetData(0, loc.GetPositionX());
104 stmt->SetData(1, loc.GetPositionY());
105 stmt->SetData(2, loc.GetPositionZ());
106 stmt->SetData(3, loc.GetOrientation());
107 stmt->SetData(4, uint16(loc.GetMapId()));
108 stmt->SetData(5, zoneId);
109 stmt->SetData(6, guid.GetCounter());
110
111 CharacterDatabase.ExecuteOrAppend(trans, stmt);
112}

References CHAR_UPD_CHARACTER_POSITION, CharacterDatabase, ObjectGuid::GetCounter(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and PreparedStatementBase::SetData().

◆ SaveRecallPosition()

◆ SaveToDB() [1/2]

void Player::SaveToDB ( bool  create,
bool  logout 
)

◆ SaveToDB() [2/2]

void Player::SaveToDB ( CharacterDatabaseTransaction  trans,
bool  create,
bool  logout 
)
7074{
7075 // delay auto save at any saves (manual, in code, or autosave)
7076 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
7077
7078 //lets allow only players in world to be saved
7080 {
7082 return;
7083 }
7084
7085 // pussywizard: full save now, so clear partial additional saves
7088
7089 // first save/honor gain after midnight will also update the player's honor fields
7091
7092 LOG_DEBUG("entities.unit", "The value of player {} at save: ", m_name);
7094
7095 if (!create)
7096 sScriptMgr->OnPlayerSave(this);
7097
7098 _SaveCharacter(create, trans);
7099
7100 if (m_mailsUpdated) //save mails only when needed
7101 _SaveMail(trans);
7102
7103 _SaveEntryPoint(trans);
7104 _SaveInventory(trans);
7105 _SaveQuestStatus(trans);
7106 _SaveDailyQuestStatus(trans);
7110 _SaveTalents(trans);
7111 _SaveSpells(trans);
7112 _SaveSpellCooldowns(trans, logout);
7113 _SaveActions(trans);
7114 _SaveAuras(trans, logout);
7115 _SaveSkills(trans);
7116 m_achievementMgr->SaveToDB(trans);
7117 m_reputationMgr->SaveToDB(trans);
7118 _SaveEquipmentSets(trans);
7119 GetSession()->SaveTutorialsData(trans); // changed only while character in game
7120 _SaveGlyphs(trans);
7122 _SavePlayerSettings(trans);
7123
7124 // check if stats should only be saved on logout
7125 // save stats can be out of transaction
7127 _SaveStats(trans);
7128
7129 // save pet (hunter pet level and experience and all type pets health/mana).
7130 if (Pet* pet = GetPet())
7131 pet->SavePetToDB(PET_SAVE_AS_CURRENT);
7132}
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition: IWorld.h:75
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: AchievementMgr.cpp:556
bool IsBeingTeleportedFar() const
Definition: Player.h:2068
void _SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7630
void _SaveTalents(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14974
void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7535
void _SaveSpells(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7708
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans)
Definition: Player.cpp:14628
void _SaveSkills(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7652
void _SaveEquipmentSets(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14494
void _SaveGlyphs(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14927
void _SaveMail(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7393
void _SaveQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7468
void _SaveAuras(CharacterDatabaseTransaction trans, bool logout)
Definition: PlayerStorage.cpp:7197
void _SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7596
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
Definition: Player.cpp:15820
void _SavePlayerSettings(CharacterDatabaseTransaction trans)
Definition: PlayerSettings.cpp:91
void _SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7573
void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
Definition: Player.cpp:3602
void _SaveEntryPoint(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14545
void _SaveStats(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7755
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: ReputationMgr.cpp:625
bool isLogingOut() const
Is the user engaged in a log out process?
Definition: WorldSession.h:385
void SaveTutorialsData(CharacterDatabaseTransaction trans)
Definition: WorldSession.cpp:937

References _SaveActions(), _SaveAuras(), _SaveCharacter(), _SaveDailyQuestStatus(), _SaveEntryPoint(), _SaveEquipmentSets(), _SaveGlyphs(), _SaveInstanceTimeRestrictions(), _SaveInventory(), _SaveMail(), _SaveMonthlyQuestStatus(), _SavePlayerSettings(), _SaveQuestStatus(), _SaveSeasonalQuestStatus(), _SaveSkills(), _SaveSpellCooldowns(), _SaveSpells(), _SaveStats(), _SaveTalents(), _SaveWeeklyQuestStatus(), CONFIG_INTERVAL_SAVE, CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, DELAYED_SAVE_PLAYER, GetPet(), GetSession(), IsBeingTeleportedFar(), WorldSession::isLogingOut(), LOG_DEBUG, m_achievementMgr, m_additionalSaveMask, m_additionalSaveTimer, m_mailsUpdated, WorldObject::m_name, m_nextSave, m_reputationMgr, m_session, outDebugValues(), PET_SAVE_AS_CURRENT, AchievementMgr::SaveToDB(), ReputationMgr::SaveToDB(), WorldSession::SaveTutorialsData(), ScheduleDelayedOperation(), sScriptMgr, sWorld, and UpdateHonorFields().

◆ Say() [1/2]

void Player::Say ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles said message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9295{
9296 std::string _text(text);
9297 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_SAY, language, _text))
9298 {
9299 return;
9300 }
9301
9302 sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
9303
9304 WorldPacket data;
9305 ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
9306 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true, false, false, true);
9307}
@ CONFIG_LISTEN_RANGE_SAY
Definition: IWorld.h:199
@ CHAT_MSG_SAY
Definition: SharedDefines.h:3153
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:267
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self) const override
Definition: Player.cpp:5617

References ChatHandler::BuildChatPacket(), CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by Unit::HandleDummyAuraProc(), WorldSession::HandleMessagechatOpcode(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and boss_headless_horseman::UpdateAI().

◆ Say() [2/2]

void Player::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9310{
9311 Talk(textId, CHAT_MSG_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
9312}
Talk
Definition: hyjal.cpp:82

References CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ ScheduleDelayedOperation()

void Player::ScheduleDelayedOperation ( uint32  operation)
inline
2076 {
2077 if (operation < DELAYED_END)
2078 m_DelayedOperations |= operation;
2079 }
@ DELAYED_END
Definition: Player.h:909

References DELAYED_END, and m_DelayedOperations.

Referenced by Battleground::RemovePlayerAtLeave(), ResurectUsingRequestData(), SaveToDB(), and TeleportToEntryPoint().

◆ SendActionButtons()

void Player::SendActionButtons ( uint32  state) const
5495{
5496 LOG_DEBUG("entities.player", "Sending Action Buttons for {} spec {}", GetGUID().ToString(), m_activeSpec);
5497
5499 data << uint8(state);
5500 /*
5501 state can be 0, 1, 2
5502 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
5503 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
5504 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
5505 */
5506 if (state != 2)
5507 {
5508 for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
5509 {
5510 ActionButtonList::const_iterator itr = m_actionButtons.find(button);
5511 if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
5512 data << uint32(itr->second.packedData);
5513 else
5514 data << uint32(0);
5515 }
5516 }
5517
5518 GetSession()->SendPacket(&data);
5519 LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec);
5520}
@ SMSG_ACTION_BUTTONS
Definition: Opcodes.h:327

References ACTIONBUTTON_DELETED, Object::GetGUID(), GetSession(), LOG_DEBUG, m_actionButtons, m_activeSpec, MAX_ACTION_BUTTONS, WorldSession::SendPacket(), SMSG_ACTION_BUTTONS, and Position::ToString().

Referenced by ActivateSpec(), WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and SendInitialActionButtons().

◆ SendAttackSwingBadFacingAttack()

void Player::SendAttackSwingBadFacingAttack ( )
147{
149 GetSession()->SendPacket(&data);
150}
@ SMSG_ATTACKSWING_BADFACING
Definition: Opcodes.h:356

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_BADFACING.

Referenced by Update().

◆ SendAttackSwingCancelAttack()

◆ SendAttackSwingCantAttack()

void Player::SendAttackSwingCantAttack ( )
135{
137 GetSession()->SendPacket(&data);
138}
@ SMSG_ATTACKSWING_CANT_ATTACK
Definition: Opcodes.h:359

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_CANT_ATTACK.

◆ SendAttackSwingDeadTarget()

void Player::SendAttackSwingDeadTarget ( )
129{
131 GetSession()->SendPacket(&data);
132}
@ SMSG_ATTACKSWING_DEADTARGET
Definition: Opcodes.h:358

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_DEADTARGET.

◆ SendAttackSwingNotInRange()

void Player::SendAttackSwingNotInRange ( )
79{
81 GetSession()->SendPacket(&data);
82}
@ SMSG_ATTACKSWING_NOTINRANGE
Definition: Opcodes.h:355

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_NOTINRANGE.

Referenced by Update().

◆ SendAutoRepeatCancel()

void Player::SendAutoRepeatCancel ( Unit target)
153{
155 data << target->GetPackGUID(); // may be it's target guid
156 SendMessageToSet(&data, true);
157}
@ SMSG_CANCEL_AUTO_REPEAT
Definition: Opcodes.h:698
std::size_t size() const
Definition: ObjectGuid.h:274

References Object::GetPackGUID(), SendMessageToSet(), PackedGuid::size(), and SMSG_CANCEL_AUTO_REPEAT.

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), and Unit::InterruptSpell().

◆ SendBattlefieldWorldStates()

void Player::SendBattlefieldWorldStates ( )

Send misc stuff that needs to be sent on every login, like the battle timers.

8797{
8799 if (sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1)
8800 {
8801 if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
8802 {
8805 SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); // Note: cleanup these two, their names look awkward
8807
8808 for (uint32 i = 0; i < 2; ++i)
8809 SendUpdateWorldState(ClockWorldState[i], uint32(GameTime::GetGameTime().count() + (wg->GetTimer() / 1000)));
8810 }
8811 }
8812}
const uint32 ClockWorldState[2]
Definition: BattlefieldWG.h:42
@ BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE
Definition: BattlefieldWG.h:112
@ BATTLEFIELD_WG_WORLD_STATE_ACTIVE
Definition: BattlefieldWG.h:109
@ BATTLEFIELD_WG_WORLD_STATE_DEFENDER
Definition: BattlefieldWG.h:110
@ BATTLEFIELD_WG_WORLD_STATE_ATTACKER
Definition: BattlefieldWG.h:111
@ CONFIG_WINTERGRASP_ENABLE
Definition: IWorld.h:325
Definition: BattlefieldWG.h:277
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition: PlayerUpdates.cpp:2193

References BATTLEFIELD_BATTLEID_WG, BATTLEFIELD_WG_WORLD_STATE_ACTIVE, BATTLEFIELD_WG_WORLD_STATE_ATTACKER, BATTLEFIELD_WG_WORLD_STATE_DEFENDER, BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE, ClockWorldState, CONFIG_WINTERGRASP_ENABLE, GameTime::GetGameTime(), sBattlefieldMgr, SendUpdateWorldState(), and sWorld.

Referenced by SendInitWorldStates().

◆ SendBGWeekendWorldStates()

void Player::SendBGWeekendWorldStates ( )
8782{
8783 for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
8784 {
8785 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(i);
8786 if (bl && bl->HolidayWorldStateId)
8787 {
8790 else
8792 }
8793 }
8794}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
Definition: BattlegroundMgr.cpp:896
Definition: DBCStructure.h:604
uint32 HolidayWorldStateId
Definition: DBCStructure.h:612
uint32 id
Definition: DBCStructure.h:605

References BattlemasterListEntry::HolidayWorldStateId, BattlemasterListEntry::id, BattlegroundMgr::IsBGWeekend(), sBattlemasterListStore, and SendUpdateWorldState().

Referenced by SendInitWorldStates().

◆ SendBuyError()

void Player::SendBuyError ( BuyResult  msg,
Creature creature,
uint32  item,
uint32  param 
)
4080{
4081 LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED");
4082 WorldPacket data(SMSG_BUY_FAILED, (8 + 4 + 4 + 1));
4083 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4084 data << uint32(item);
4085 if (param > 0)
4086 data << uint32(param);
4087 data << uint8(msg);
4088 GetSession()->SendPacket(&data);
4089}
@ SMSG_BUY_FAILED
Definition: Opcodes.h:451

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_BUY_FAILED.

Referenced by BuyItemFromVendorSlot(), WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendBuyErrorCommand(), WorldSession::HandlePetitionBuyOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), ProcessCastaction(), ProcessUnlearnAction(), and resetTalents().

◆ SendCanTakeQuestResponse()

◆ SendCinematicStart()

void Player::SendCinematicStart ( uint32  CinematicSequenceId) const
5654{
5656 data << uint32(CinematicSequenceId);
5657 SendDirectMessage(&data);
5658 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
5659 {
5660 _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
5661 }
5662}
DBCStorage< CinematicSequencesEntry > sCinematicSequencesStore(CinematicSequencesEntryfmt)
@ SMSG_TRIGGER_CINEMATIC
Definition: Opcodes.h:280
void SetActiveCinematicCamera(uint32 cinematicCameraId=0)
Definition: CinematicMgr.h:39
Definition: DBCStructure.h:713

References _cinematicMgr, sCinematicSequencesStore, SendDirectMessage(), CinematicMgr::SetActiveCinematicCamera(), and SMSG_TRIGGER_CINEMATIC.

Referenced by debug_commandscript::HandleDebugPlayCinematicCommand(), WorldSession::HandlePlayerLoginFromDB(), and GameObject::Use().

◆ SendClearCooldown()

void Player::SendClearCooldown ( uint32  spell_id,
Unit target 
)

◆ SendCooldownEvent()

void Player::SendCooldownEvent ( SpellInfo const *  spellInfo,
uint32  itemId = 0,
Spell spell = nullptr,
bool  setCooldown = true 
)
11062{
11063 // start cooldowns at server side, if any
11064 if (setCooldown)
11065 AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
11066
11067 // Send activate cooldown timer (possible 0) at client side
11068 WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
11069 data << uint32(spellInfo->Id);
11070 data << GetGUID();
11071 SendDirectMessage(&data);
11072}
@ SMSG_COOLDOWN_EVENT
Definition: Opcodes.h:339
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10863

References AddSpellAndCategoryCooldowns(), Object::GetGUID(), SpellInfo::Id, SendDirectMessage(), and SMSG_COOLDOWN_EVENT.

Referenced by Spell::_handle_finish_phase(), Aura::_UnapplyForTarget(), Spell::finish(), Unit::RemoveGameObject(), Unit::SetMinion(), and UpdatePotionCooldown().

◆ SendCorpseReclaimDelay()

void Player::SendCorpseReclaimDelay ( uint32  delay)
12925{
12927 data << uint32(delay);
12928 GetSession()->SendPacket(&data);
12929}
@ SMSG_CORPSE_RECLAIM_DELAY
Definition: Opcodes.h:647

References GetSession(), WorldSession::SendPacket(), and SMSG_CORPSE_RECLAIM_DELAY.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ SendDirectMessage()

void Player::SendDirectMessage ( WorldPacket const *  data) const
5649{
5650 m_session->SendPacket(data);
5651}

References m_session, and WorldSession::SendPacket().

Referenced by Guild::_SendBankList(), Group::AddMember(), AddSpellAndCategoryCooldowns(), Creature::AddSpellCooldown(), AddSpellMod(), DoRandomRoll(), DuelComplete(), Spell::EffectBind(), Spell::EffectPlayMusic(), BGQueueRemoveEvent::Execute(), GiveLevel(), Aura::HandleAuraSpecificMods(), Guild::HandleInviteMember(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), Unit::Kill(), Pet::learnSpell(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), WorldObject::PlayDirectMusic(), WorldObject::PlayDirectSound(), WorldObject::PlayDistanceSound(), AchievementMgr::RemoveCriteriaProgress(), AchievementMgr::Reset(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), SendCinematicStart(), SendClearCooldown(), Unit::SendComboPoints(), SendCooldownEvent(), AchievementMgr::SendCriteriaUpdate(), SendDurabilityLoss(), WeatherMgr::SendFineWeatherUpdateToPlayer(), ReputationMgr::SendForceReactions(), ReputationMgr::SendInitialReputations(), Map::SendInitSelf(), SendLoot(), SendLootError(), SendLootRelease(), Unit::SendMeleeAttackStart(), SendMessageToSet(), SendMessageToSetInRange(), SendMirrorTimer(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), SendMovieStart(), World::SendServerMessage(), Unit::SendSpellNonMeleeReflectLog(), ReputationMgr::SendState(), Unit::SendTameFailure(), SendTaxiNodeStatusMultiple(), SendUpdateWorldState(), ReputationMgr::SendVisible(), Weather::SendWeatherUpdateToPlayer(), ChatHandler::SendWorldTextOptional(), Map::SendZoneDynamicInfo(), SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), SetDisableGravity(), SetFeatherFall(), Creature::SetFeatherFall(), SetHover(), Unit::SetOwnerGUID(), Unit::SetRooted(), SetWaterWalking(), Creature::SetWaterWalking(), StopMirrorTimer(), Pet::unlearnSpell(), Unit::Whisper(), and Whisper().

◆ SendDuelCountdown()

void Player::SendDuelCountdown ( uint32  counter)
15299{
15301 data << uint32(counter); // seconds
15302 GetSession()->SendPacket(&data);
15303}
@ SMSG_DUEL_COUNTDOWN
Definition: Opcodes.h:725

References GetSession(), WorldSession::SendPacket(), and SMSG_DUEL_COUNTDOWN.

Referenced by WorldSession::HandleDuelAcceptedOpcode().

◆ SendDungeonDifficulty()

void Player::SendDungeonDifficulty ( bool  IsInGroup)

◆ SendDurabilityLoss()

void Player::SendDurabilityLoss ( )

◆ SendEnchantmentDurations()

void Player::SendEnchantmentDurations ( )
4742{
4743 for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4744 {
4745 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), itr->item->GetGUID(), itr->slot, uint32(itr->leftduration) / 1000);
4746 }
4747}

References Object::GetGUID(), GetSession(), m_enchantDuration, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendEquipError()

void Player::SendEquipError ( InventoryResult  msg,
Item pItem,
Item pItem2 = nullptr,
uint32  itemid = 0 
)
4037{
4038 LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE ({})", msg);
4040 data << uint8(msg);
4041
4042 if (msg != EQUIP_ERR_OK)
4043 {
4044 data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
4045 data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
4046 data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
4047
4048 switch (msg)
4049 {
4052 {
4053 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4054 data << uint32(proto ? proto->RequiredLevel : 0);
4055 break;
4056 }
4057 case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one...
4058 {
4059 data << ObjectGuid::Empty; // item guid
4060 data << uint32(0); // slot
4061 data << ObjectGuid::Empty; // container
4062 break;
4063 }
4067 {
4068 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4069 data << uint32(proto ? proto->ItemLimitCategory : 0);
4070 break;
4071 }
4072 default:
4073 break;
4074 }
4075 }
4076 GetSession()->SendPacket(&data);
4077}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED
Definition: Item.h:131
@ EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM
Definition: Item.h:127
@ EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW
Definition: Item.h:133
@ SMSG_INVENTORY_CHANGE_FAILURE
Definition: Opcodes.h:304
uint32 RequiredLevel
Definition: ItemTemplate.h:636

References ObjectGuid::Empty, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED, EQUIP_ERR_OK, EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW, Object::GetGUID(), GetSession(), Item::GetTemplate(), ItemTemplate::ItemLimitCategory, LOG_DEBUG, ItemTemplate::RequiredLevel, WorldSession::SendPacket(), SMSG_INVENTORY_CHANGE_FAILURE, and sObjectMgr.

Referenced by _StoreOrEquipNewItem(), AutoStoreLoot(), BuyItemFromVendorSlot(), CanAddQuest(), CanRewardQuest(), CastItemUseSpell(), Spell::CheckItems(), Group::CountTheRoll(), Spell::DoCreateItem(), Spell::EffectRechargeManaGem(), GiveQuestSourceItem(), WorldSession::HandleAcceptTradeOpcode(), misc_commandscript::HandleAddItemSetCommand(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), AuraEffect::HandleChannelDeathItem(), debug_commandscript::HandleDebugSendEquipErrorCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleReadItem(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSocketOpcode(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), WorldSession::HandleUseItemOpcode(), WorldSession::HandleWrapItemOpcode(), ModifyMoney(), item_petrov_cluster_bombs::OnUse(), item_only_for_flight::OnUse(), item_incendiary_explosives::OnUse(), item_captured_frog::OnUse(), ProcessUnlearnAction(), SetAmmo(), SplitItem(), StoreLootItem(), SwapItem(), and TakeQuestSourceItem().

◆ SendEquipmentSetList()

void Player::SendEquipmentSetList ( )
14424{
14425 uint32 count = 0;
14427 std::size_t count_pos = data.wpos();
14428 data << uint32(count); // count placeholder
14429 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14430 {
14431 if (itr->second.state == EQUIPMENT_SET_DELETED)
14432 continue;
14433
14434 data.appendPackGUID(itr->second.Guid);
14435 data << uint32(itr->first);
14436 data << itr->second.Name;
14437 data << itr->second.IconName;
14438 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14439 {
14440 // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item
14441 if (itr->second.IgnoreMask & (1 << i))
14442 data.appendPackGUID(uint64(1));
14443 else // xinef: send proper data (do not append 0 with high guid)
14444 data.appendPackGUID(itr->second.Items[i] ? itr->second.Items[i].GetRawValue() : uint64(0));
14445 }
14446
14447 ++count; // client have limit but it checked at loading and set
14448 }
14449 data.put<uint32>(count_pos, count);
14450 GetSession()->SendPacket(&data);
14451}
@ SMSG_EQUIPMENT_SET_LIST
Definition: Opcodes.h:1242

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_DELETED, EQUIPMENT_SLOT_END, GetSession(), m_EquipmentSets, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_LIST, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendExplorationExperience()

void Player::SendExplorationExperience ( uint32  Area,
uint32  Experience 
)
160{
162 data << uint32(Area);
163 data << uint32(Experience);
164 GetSession()->SendPacket(&data);
165}
@ SMSG_EXPLORATION_EXPERIENCE
Definition: Opcodes.h:534

References GetSession(), WorldSession::SendPacket(), and SMSG_EXPLORATION_EXPERIENCE.

Referenced by CheckAreaExploreAndOutdoor().

◆ SendInitialActionButtons()

void Player::SendInitialActionButtons ( ) const
inline

◆ SendInitialPacketsAfterAddToMap()

void Player::SendInitialPacketsAfterAddToMap ( )
11588{
11590
11593
11594 CastSpell(this, 836, true); // LOGINEFFECT
11595
11596 // set some aura effects that send packet to player client after add player to map
11597 // SendMessageToSet not send it to player not it map, only for aura that not changed anything at re-apply
11598 // same auras state lost at far teleport, send it one more time in this case also
11599 static const AuraType auratypes[] =
11600 {
11604 };
11605 for (AuraType const* itr = &auratypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
11606 {
11607 Unit::AuraEffectList const& auraList = GetAuraEffectsByType(*itr);
11608 if (!auraList.empty())
11609 auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
11610 }
11611
11612 // Fix mount, update block gets messed somewhere
11613 {
11615 {
11616 AddAura(GetMountBlockId(), this);
11617 SetMountBlockId(0);
11618 }
11619 }
11620
11621 // update zone
11622 uint32 newzone, newarea;
11623 GetZoneAndAreaId(newzone, newarea);
11624 UpdateZone(newzone, newarea); // also call SendInitWorldStates();
11625
11628
11629 // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
11631 {
11633 data2 << GetPackGUID();
11634 data2 << (uint32)2;
11635 SendMessageToSet(&data2, true);
11636 }
11637
11638 SendEnchantmentDurations(); // must be after add to map
11639 SendItemDurations(); // must be after add to map
11642
11643 // raid downscaling - send difficulty to player
11644 if (GetMap()->IsRaid())
11645 {
11647 {
11650 }
11651 }
11653 SendRaidDifficulty(GetGroup() != nullptr);
11654}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
void UpdateVisibilityForPlayer(bool mapChange=false)
Definition: PlayerUpdates.cpp:1542
uint32 GetMountBlockId()
Definition: Player.h:2580
void SendTaxiNodeStatusMultiple()
Definition: Player.cpp:10459
Difficulty GetStoredRaidDifficulty() const
Definition: Player.h:1899
void SendEnchantmentDurations()
Definition: PlayerStorage.cpp:4741
void SendItemDurations()
Definition: PlayerStorage.cpp:4757
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition: PlayerMisc.cpp:177
void SendTimeSync()
Definition: WorldSession.cpp:1617
void ResetTimeSync()
Definition: WorldSession.cpp:1611

References Unit::AddAura(), AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Unit::CastSpell(), Unit::GetAuraEffectsByType(), GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetMountBlockId(), Object::GetPackGUID(), GetRaidDifficulty(), GetSession(), GetStoredRaidDifficulty(), WorldObject::GetZoneAndAreaId(), Unit::HasAuraType(), isBeingLoaded(), MOVE_ROOT, WorldSession::ResetTimeSync(), SendEnchantmentDurations(), SendItemDurations(), SendMessageToSet(), SendQuestGiverStatusMultiple(), SendRaidDifficulty(), SendTaxiNodeStatusMultiple(), WorldSession::SendTimeSync(), SetMountBlockId(), SetMovement(), SMSG_FORCE_MOVE_ROOT, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_MOUNTED, SPELL_AURA_NONE, SPELL_AURA_SAFE_FALL, SPELL_AURA_TRANSFORM, SPELL_AURA_WATER_WALK, StoreRaidMapDifficulty(), UpdateVisibilityForPlayer(), and UpdateZone().

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialPacketsBeforeAddToMap()

void Player::SendInitialPacketsBeforeAddToMap ( )

Pass 'this' as argument because we're not stored in ObjectAccessor yet

11531{
11534
11535 // guild bank list?
11536
11537 // Homebind
11538 WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4);
11539 data << m_homebindX << m_homebindY << m_homebindZ;
11540 data << (uint32) m_homebindMapId;
11541 data << (uint32) m_homebindAreaId;
11542 GetSession()->SendPacket(&data);
11543
11544 // SMSG_SET_PROFICIENCY
11545 // SMSG_SET_PCT_SPELL_MODIFIER
11546 // SMSG_SET_FLAT_SPELL_MODIFIER
11547 // SMSG_UPDATE_AURA_DURATION
11548
11549 SendTalentsInfoData(false);
11550
11551 // SMSG_INSTANCE_DIFFICULTY
11552 data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4);
11553 data << uint32(GetMap()->GetDifficulty());
11554 data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty
11555 GetSession()->SendPacket(&data);
11556
11558
11559 data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
11560 data << uint32(0); // count, for (count) uint32;
11561 GetSession()->SendPacket(&data);
11562
11566
11568
11569 data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
11570 data.AppendPackedTime(GameTime::GetGameTime().count());
11571 data << float(0.01666667f); // game speed
11572 data << uint32(0); // added in 3.1.2
11573 GetSession()->SendPacket(&data);
11574
11575 GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
11576
11577 // SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
11578 // SMSG_PET_GUIDS
11579 // SMSG_UPDATE_WORLD_STATE
11580 // SMSG_POWER_UPDATE
11581
11582 SetMover(this);
11583
11584 sScriptMgr->OnSendInitialPacketsBeforeAddToMap(this, data);
11585}
@ SMSG_INSTANCE_DIFFICULTY
Definition: Opcodes.h:857
@ SMSG_BINDPOINTUPDATE
Definition: Opcodes.h:371
@ SMSG_LOGIN_SETTIMESPEED
Definition: Opcodes.h:96
@ SMSG_SEND_UNLEARN_SPELLS
Definition: Opcodes.h:1084
void SendAllAchievementData() const
Definition: AchievementMgr.cpp:2339
void SendInitialSpells()
Definition: Player.cpp:2743
PlayerSocial * GetSocial()
Definition: Player.h:1140
void SendInitialActionButtons() const
Definition: Player.h:1819
void SendEquipmentSetList()
Definition: Player.cpp:14423
void SetMover(Unit *target)
Definition: Player.cpp:12843
void SendSocialList(Player *player, uint32 flags)
Definition: SocialMgr.cpp:124
void SendInitialReputations()
Definition: ReputationMgr.cpp:211
void SendForceReactions()
Definition: ReputationMgr.cpp:165

References ByteBuffer::AppendPackedTime(), GetDifficulty(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMap(), GetReputationMgr(), GetSession(), GetSocial(), WorldPacket::Initialize(), m_achievementMgr, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_reputationMgr, AchievementMgr::SendAllAchievementData(), SendEquipmentSetList(), ReputationMgr::SendForceReactions(), SendInitialActionButtons(), ReputationMgr::SendInitialReputations(), SendInitialSpells(), WorldSession::SendPacket(), PlayerSocial::SendSocialList(), SendTalentsInfoData(), SetMover(), SMSG_BINDPOINTUPDATE, SMSG_INSTANCE_DIFFICULTY, SMSG_LOGIN_SETTIMESPEED, SMSG_SEND_UNLEARN_SPELLS, SOCIAL_FLAG_ALL, and sScriptMgr.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialSpells()

void Player::SendInitialSpells ( )
2744{
2745 uint32 curTime = GameTime::GetGameTimeMS().count();
2747
2748 uint16 spellCount = 0;
2749
2750 WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4)));
2751 data << uint8(0);
2752
2753 std::size_t countPos = data.wpos();
2754 data << uint16(spellCount); // spell count placeholder
2755
2756 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
2757 {
2758 if (itr->second->State == PLAYERSPELL_REMOVED)
2759 continue;
2760
2761 if (!itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
2762 continue;
2763
2764 data << uint32(itr->first);
2765 data << uint16(0); // it's not slot id
2766
2767 ++spellCount;
2768 }
2769
2770 // Added spells from glyphs too (needed by spell tooltips)
2771 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
2772 {
2773 if (uint32 glyph = GetGlyph(i))
2774 {
2775 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
2776 {
2777 data << uint32(glyphEntry->SpellId);
2778 data << uint16(0); // it's not slot id
2779
2780 ++spellCount;
2781 }
2782 }
2783 }
2784
2785 // xinef: we have to send talents, but not those on m_spells list
2786 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
2787 {
2788 if (itr->second->State == PLAYERSPELL_REMOVED)
2789 continue;
2790
2791 // xinef: remove all active talent auras
2792 if (!(itr->second->specMask & GetActiveSpecMask()))
2793 continue;
2794
2795 // xinef: already sent from m_spells
2796 if (itr->second->inSpellBook)
2797 continue;
2798
2799 data << uint32(itr->first);
2800 data << uint16(0); // it's not slot id
2801
2802 ++spellCount;
2803 }
2804
2805 data.put<uint16>(countPos, spellCount); // write real count value
2806
2807 uint16 spellCooldowns = m_spellCooldowns.size();
2808 data << uint16(spellCooldowns);
2809 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
2810 {
2811 if (!itr->second.needSendToClient)
2812 continue;
2813
2814 SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first);
2815 if (!sEntry)
2816 continue;
2817
2818 data << uint32(itr->first);
2819
2820 data << uint16(itr->second.itemid); // cast item id
2821 data << uint16(itr->second.category); // spell category
2822
2823 // send infinity cooldown in special format
2824 if (itr->second.end >= infTime)
2825 {
2826 data << uint32(1); // cooldown
2827 data << uint32(0x80000000); // category cooldown
2828 continue;
2829 }
2830
2831 uint32 cooldown = itr->second.end > curTime ? itr->second.end - curTime : 0;
2832 data << uint32(itr->second.category ? 0 : cooldown); // cooldown
2833 data << uint32(itr->second.category ? cooldown : 0); // category cooldown
2834 }
2835
2836 GetSession()->SendPacket(&data);
2837}
@ SMSG_INITIAL_SPELLS
Definition: Opcodes.h:328

References GetActiveSpec(), GetActiveSpecMask(), GameTime::GetGameTimeMS(), GetGlyph(), GetSession(), infinityCooldownDelayCheck, m_spellCooldowns, m_spells, m_talents, MAX_GLYPH_SLOT_INDEX, PLAYERSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), sGlyphPropertiesStore, SMSG_INITIAL_SPELLS, sSpellMgr, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendInitWorldStates()

void Player::SendInitWorldStates ( uint32  zone,
uint32  area 
)
8143{
8144 // data depends on zoneid/mapid...
8146 uint32 mapid = GetMapId();
8147 OutdoorPvP* pvp = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneid);
8148 InstanceScript* instance = GetInstanceScript();
8149 Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(zoneid);
8150
8151 LOG_DEBUG("network", "Sending SMSG_INIT_WORLD_STATES to Map: {}, Zone: {}", mapid, zoneid);
8152
8153 WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (12 * 8)));
8154 data << uint32(mapid); // mapid
8155 data << uint32(zoneid); // zone id
8156 data << uint32(areaid); // area id, new 2.1.0
8157 std::size_t countPos = data.wpos();
8158 data << uint16(0); // count of uint64 blocks
8159 data << uint32(0x8d8) << uint32(0x0); // 1
8160 data << uint32(0x8d7) << uint32(0x0); // 2
8161 data << uint32(0x8d6) << uint32(0x0); // 3
8162 data << uint32(0x8d5) << uint32(0x0); // 4
8163 data << uint32(0x8d4) << uint32(0x0); // 5
8164 data << uint32(0x8d3) << uint32(0x0); // 6
8165 // 7 1 - Arena season in progress, 0 - end of season
8166 data << uint32(0xC77) << uint32(sWorld->getBoolConfig(CONFIG_ARENA_SEASON_IN_PROGRESS));
8167 // 8 Arena season id
8168 data << uint32(0xF3D) << uint32(sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID));
8169
8170 if (mapid == 530) // Outland
8171 {
8172 data << uint32(0x9bf) << uint32(0x0); // 7
8173 data << uint32(0x9bd) << uint32(0xF); // 8
8174 data << uint32(0x9bb) << uint32(0xF); // 9
8175 }
8176
8178 {
8179 Player::bgZoneIdToFillWorldStates[zoneid](bg, data);
8180 }
8181 else
8182 {
8183 // insert <field> <value>
8184 switch (zoneid)
8185 {
8186 case 1: // Dun Morogh
8187 case 11: // Wetlands
8188 case 12: // Elwynn Forest
8189 case 38: // Loch Modan
8190 case 40: // Westfall
8191 case 51: // Searing Gorge
8192 case 1519: // Stormwind City
8193 case 1537: // Ironforge
8194 case 2257: // Deeprun Tram
8195 case 3703: // Shattrath City
8196 break;
8197 case 139: // Eastern Plaguelands
8198 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_EP)
8199 pvp->FillInitialWorldStates(data);
8200 else
8201 {
8202 data << uint32(0x97a) << uint32(0x0); // 10 2426
8203 data << uint32(0x917) << uint32(0x0); // 11 2327
8204 data << uint32(0x918) << uint32(0x0); // 12 2328
8205 data << uint32(0x97b) << uint32(0x32); // 13 2427
8206 data << uint32(0x97c) << uint32(0x32); // 14 2428
8207 data << uint32(0x933) << uint32(0x1); // 15 2355
8208 data << uint32(0x946) << uint32(0x0); // 16 2374
8209 data << uint32(0x947) << uint32(0x0); // 17 2375
8210 data << uint32(0x948) << uint32(0x0); // 18 2376
8211 data << uint32(0x949) << uint32(0x0); // 19 2377
8212 data << uint32(0x94a) << uint32(0x0); // 20 2378
8213 data << uint32(0x94b) << uint32(0x0); // 21 2379
8214 data << uint32(0x932) << uint32(0x0); // 22 2354
8215 data << uint32(0x934) << uint32(0x0); // 23 2356
8216 data << uint32(0x935) << uint32(0x0); // 24 2357
8217 data << uint32(0x936) << uint32(0x0); // 25 2358
8218 data << uint32(0x937) << uint32(0x0); // 26 2359
8219 data << uint32(0x938) << uint32(0x0); // 27 2360
8220 data << uint32(0x939) << uint32(0x1); // 28 2361
8221 data << uint32(0x930) << uint32(0x1); // 29 2352
8222 data << uint32(0x93a) << uint32(0x0); // 30 2362
8223 data << uint32(0x93b) << uint32(0x0); // 31 2363
8224 data << uint32(0x93c) << uint32(0x0); // 32 2364
8225 data << uint32(0x93d) << uint32(0x0); // 33 2365
8226 data << uint32(0x944) << uint32(0x0); // 34 2372
8227 data << uint32(0x945) << uint32(0x0); // 35 2373
8228 data << uint32(0x931) << uint32(0x1); // 36 2353
8229 data << uint32(0x93e) << uint32(0x0); // 37 2366
8230 data << uint32(0x931) << uint32(0x1); // 38 2367 ?? grey horde not in dbc! send for consistency's sake, and to match field count
8231 data << uint32(0x940) << uint32(0x0); // 39 2368
8232 data << uint32(0x941) << uint32(0x0); // 7 2369
8233 data << uint32(0x942) << uint32(0x0); // 8 2370
8234 data << uint32(0x943) << uint32(0x0); // 9 2371
8235 }
8236 break;
8237 case 1377: // Silithus
8238 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_SI)
8239 pvp->FillInitialWorldStates(data);
8240 else
8241 {
8242 // states are always shown
8243 data << uint32(2313) << uint32(0x0); // 7 ally silityst gathered
8244 data << uint32(2314) << uint32(0x0); // 8 horde silityst gathered
8245 data << uint32(2317) << uint32(0x0); // 9 max silithyst
8246 }
8247 // dunno about these... aq opening event maybe?
8248 data << uint32(2322) << uint32(0x0); // 10 sandworm N
8249 data << uint32(2323) << uint32(0x0); // 11 sandworm S
8250 data << uint32(2324) << uint32(0x0); // 12 sandworm SW
8251 data << uint32(2325) << uint32(0x0); // 13 sandworm E
8252 break;
8253 case 2597: // Alterac Valley
8254 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV)
8255 bg->FillInitialWorldStates(data);
8256 else
8257 {
8258 data << uint32(0x7ae) << uint32(0x1); // 7 snowfall n
8259 data << uint32(0x532) << uint32(0x1); // 8 frostwolfhut hc
8260 data << uint32(0x531) << uint32(0x0); // 9 frostwolfhut ac
8261 data << uint32(0x52e) << uint32(0x0); // 10 stormpike firstaid a_a
8262 data << uint32(0x571) << uint32(0x0); // 11 east frostwolf tower horde assaulted -unused
8263 data << uint32(0x570) << uint32(0x0); // 12 west frostwolf tower horde assaulted - unused
8264 data << uint32(0x567) << uint32(0x1); // 13 frostwolfe c
8265 data << uint32(0x566) << uint32(0x1); // 14 frostwolfw c
8266 data << uint32(0x550) << uint32(0x1); // 15 irondeep (N) ally
8267 data << uint32(0x544) << uint32(0x0); // 16 ice grave a_a
8268 data << uint32(0x536) << uint32(0x0); // 17 stormpike grave h_c
8269 data << uint32(0x535) << uint32(0x1); // 18 stormpike grave a_c
8270 data << uint32(0x518) << uint32(0x0); // 19 stoneheart grave a_a
8271 data << uint32(0x517) << uint32(0x0); // 20 stoneheart grave h_a
8272 data << uint32(0x574) << uint32(0x0); // 21 1396 unk
8273 data << uint32(0x573) << uint32(0x0); // 22 iceblood tower horde assaulted -unused
8274 data << uint32(0x572) << uint32(0x0); // 23 towerpoint horde assaulted - unused
8275 data << uint32(0x56f) << uint32(0x0); // 24 1391 unk
8276 data << uint32(0x56e) << uint32(0x0); // 25 iceblood a
8277 data << uint32(0x56d) << uint32(0x0); // 26 towerp a
8278 data << uint32(0x56c) << uint32(0x0); // 27 frostwolfe a
8279 data << uint32(0x56b) << uint32(0x0); // 28 froswolfw a
8280 data << uint32(0x56a) << uint32(0x1); // 29 1386 unk
8281 data << uint32(0x569) << uint32(0x1); // 30 iceblood c
8282 data << uint32(0x568) << uint32(0x1); // 31 towerp c
8283 data << uint32(0x565) << uint32(0x0); // 32 stoneh tower a
8284 data << uint32(0x564) << uint32(0x0); // 33 icewing tower a
8285 data << uint32(0x563) << uint32(0x0); // 34 dunn a
8286 data << uint32(0x562) << uint32(0x0); // 35 duns a
8287 data << uint32(0x561) << uint32(0x0); // 36 stoneheart bunker alliance assaulted - unused
8288 data << uint32(0x560) << uint32(0x0); // 37 icewing bunker alliance assaulted - unused
8289 data << uint32(0x55f) << uint32(0x0); // 38 dunbaldar south alliance assaulted - unused
8290 data << uint32(0x55e) << uint32(0x0); // 39 dunbaldar north alliance assaulted - unused
8291 data << uint32(0x55d) << uint32(0x0); // 40 stone tower d
8292 data << uint32(0x3c6) << uint32(0x0); // 41 966 unk
8293 data << uint32(0x3c4) << uint32(0x0); // 42 964 unk
8294 data << uint32(0x3c2) << uint32(0x0); // 43 962 unk
8295 data << uint32(0x516) << uint32(0x1); // 44 stoneheart grave a_c
8296 data << uint32(0x515) << uint32(0x0); // 45 stonheart grave h_c
8297 data << uint32(0x3b6) << uint32(0x0); // 46 950 unk
8298 data << uint32(0x55c) << uint32(0x0); // 47 icewing tower d
8299 data << uint32(0x55b) << uint32(0x0); // 48 dunn d
8300 data << uint32(0x55a) << uint32(0x0); // 49 duns d
8301 data << uint32(0x559) << uint32(0x0); // 50 1369 unk
8302 data << uint32(0x558) << uint32(0x0); // 51 iceblood d
8303 data << uint32(0x557) << uint32(0x0); // 52 towerp d
8304 data << uint32(0x556) << uint32(0x0); // 53 frostwolfe d
8305 data << uint32(0x555) << uint32(0x0); // 54 frostwolfw d
8306 data << uint32(0x554) << uint32(0x1); // 55 stoneh tower c
8307 data << uint32(0x553) << uint32(0x1); // 56 icewing tower c
8308 data << uint32(0x552) << uint32(0x1); // 57 dunn c
8309 data << uint32(0x551) << uint32(0x1); // 58 duns c
8310 data << uint32(0x54f) << uint32(0x0); // 59 irondeep (N) horde
8311 data << uint32(0x54e) << uint32(0x0); // 60 irondeep (N) ally
8312 data << uint32(0x54d) << uint32(0x1); // 61 mine (S) neutral
8313 data << uint32(0x54c) << uint32(0x0); // 62 mine (S) horde
8314 data << uint32(0x54b) << uint32(0x0); // 63 mine (S) ally
8315 data << uint32(0x545) << uint32(0x0); // 64 iceblood h_a
8316 data << uint32(0x543) << uint32(0x1); // 65 iceblod h_c
8317 data << uint32(0x542) << uint32(0x0); // 66 iceblood a_c
8318 data << uint32(0x540) << uint32(0x0); // 67 snowfall h_a
8319 data << uint32(0x53f) << uint32(0x0); // 68 snowfall a_a
8320 data << uint32(0x53e) << uint32(0x0); // 69 snowfall h_c
8321 data << uint32(0x53d) << uint32(0x0); // 70 snowfall a_c
8322 data << uint32(0x53c) << uint32(0x0); // 71 frostwolf g h_a
8323 data << uint32(0x53b) << uint32(0x0); // 72 frostwolf g a_a
8324 data << uint32(0x53a) << uint32(0x1); // 73 frostwolf g h_c
8325 data << uint32(0x539) << uint32(0x0); // 74 frostwolf g a_c
8326 data << uint32(0x538) << uint32(0x0); // 75 stormpike grave h_a
8327 data << uint32(0x537) << uint32(0x0); // 76 stormpike grave a_a
8328 data << uint32(0x534) << uint32(0x0); // 77 frostwolf hut h_a
8329 data << uint32(0x533) << uint32(0x0); // 78 frostwolf hut a_a
8330 data << uint32(0x530) << uint32(0x0); // 79 stormpike first aid h_a
8331 data << uint32(0x52f) << uint32(0x0); // 80 stormpike first aid h_c
8332 data << uint32(0x52d) << uint32(0x1); // 81 stormpike first aid a_c
8333 }
8334 break;
8335 case 3277: // Warsong Gulch
8336 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS)
8337 bg->FillInitialWorldStates(data);
8338 else
8339 {
8340 data << uint32(0x62d) << uint32(0x0); // 7 1581 alliance flag captures
8341 data << uint32(0x62e) << uint32(0x0); // 8 1582 horde flag captures
8342 data << uint32(0x609) << uint32(0x0); // 9 1545 unk, set to 1 on alliance flag pickup...
8343 data << uint32(0x60a) << uint32(0x0); // 10 1546 unk, set to 1 on horde flag pickup, after drop it's -1
8344 data << uint32(0x60b) << uint32(0x2); // 11 1547 unk
8345 data << uint32(0x641) << uint32(0x3); // 12 1601 unk (max flag captures?)
8346 data << uint32(0x922) << uint32(0x1); // 13 2338 horde (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8347 data << uint32(0x923) << uint32(0x1); // 14 2339 alliance (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8348 }
8349 break;
8350 case 3358: // Arathi Basin
8351 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB)
8352 bg->FillInitialWorldStates(data);
8353 else
8354 {
8355 data << uint32(0x6e7) << uint32(0x0); // 7 1767 stables alliance
8356 data << uint32(0x6e8) << uint32(0x0); // 8 1768 stables horde
8357 data << uint32(0x6e9) << uint32(0x0); // 9 1769 unk, ST?
8358 data << uint32(0x6ea) << uint32(0x0); // 10 1770 stables (show/hide)
8359 data << uint32(0x6ec) << uint32(0x0); // 11 1772 farm (0 - horde controlled, 1 - alliance controlled)
8360 data << uint32(0x6ed) << uint32(0x0); // 12 1773 farm (show/hide)
8361 data << uint32(0x6ee) << uint32(0x0); // 13 1774 farm color
8362 data << uint32(0x6ef) << uint32(0x0); // 14 1775 gold mine color, may be FM?
8363 data << uint32(0x6f0) << uint32(0x0); // 15 1776 alliance resources
8364 data << uint32(0x6f1) << uint32(0x0); // 16 1777 horde resources
8365 data << uint32(0x6f2) << uint32(0x0); // 17 1778 horde bases
8366 data << uint32(0x6f3) << uint32(0x0); // 18 1779 alliance bases
8367 data << uint32(0x6f4) << uint32(0x640); // 19 1780 max resources (1600)
8368 data << uint32(0x6f6) << uint32(0x0); // 20 1782 blacksmith color
8369 data << uint32(0x6f7) << uint32(0x0); // 21 1783 blacksmith (show/hide)
8370 data << uint32(0x6f8) << uint32(0x0); // 22 1784 unk, bs?
8371 data << uint32(0x6f9) << uint32(0x0); // 23 1785 unk, bs?
8372 data << uint32(0x6fb) << uint32(0x0); // 24 1787 gold mine (0 - horde contr, 1 - alliance contr)
8373 data << uint32(0x6fc) << uint32(0x0); // 25 1788 gold mine (0 - conflict, 1 - horde)
8374 data << uint32(0x6fd) << uint32(0x0); // 26 1789 gold mine (1 - show/0 - hide)
8375 data << uint32(0x6fe) << uint32(0x0); // 27 1790 gold mine color
8376 data << uint32(0x700) << uint32(0x0); // 28 1792 gold mine color, may be LM?
8377 data << uint32(0x701) << uint32(0x0); // 29 1793 lumber mill color (0 - conflict, 1 - horde contr)
8378 data << uint32(0x702) << uint32(0x0); // 30 1794 lumber mill (show/hide)
8379 data << uint32(0x703) << uint32(0x0); // 31 1795 lumber mill color color
8380 data << uint32(0x732) << uint32(0x1); // 32 1842 stables (1 - uncontrolled)
8381 data << uint32(0x733) << uint32(0x1); // 33 1843 gold mine (1 - uncontrolled)
8382 data << uint32(0x734) << uint32(0x1); // 34 1844 lumber mill (1 - uncontrolled)
8383 data << uint32(0x735) << uint32(0x1); // 35 1845 farm (1 - uncontrolled)
8384 data << uint32(0x736) << uint32(0x1); // 36 1846 blacksmith (1 - uncontrolled)
8385 data << uint32(0x745) << uint32(0x2); // 37 1861 unk
8386 data << uint32(0x7a3) << uint32(0x578); // 38 1955 warning limit (1400)
8387 }
8388 break;
8389 case 3820: // Eye of the Storm
8390 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_EY)
8391 bg->FillInitialWorldStates(data);
8392 else
8393 {
8394 data << uint32(0xac1) << uint32(0x0); // 7 2753 Horde Bases
8395 data << uint32(0xac0) << uint32(0x0); // 8 2752 Alliance Bases
8396 data << uint32(0xab6) << uint32(0x0); // 9 2742 Mage Tower - Horde conflict
8397 data << uint32(0xab5) << uint32(0x0); // 10 2741 Mage Tower - Alliance conflict
8398 data << uint32(0xab4) << uint32(0x0); // 11 2740 Fel Reaver - Horde conflict
8399 data << uint32(0xab3) << uint32(0x0); // 12 2739 Fel Reaver - Alliance conflict
8400 data << uint32(0xab2) << uint32(0x0); // 13 2738 Draenei - Alliance conflict
8401 data << uint32(0xab1) << uint32(0x0); // 14 2737 Draenei - Horde conflict
8402 data << uint32(0xab0) << uint32(0x0); // 15 2736 unk // 0 at start
8403 data << uint32(0xaaf) << uint32(0x0); // 16 2735 unk // 0 at start
8404 data << uint32(0xaad) << uint32(0x0); // 17 2733 Draenei - Horde control
8405 data << uint32(0xaac) << uint32(0x0); // 18 2732 Draenei - Alliance control
8406 data << uint32(0xaab) << uint32(0x1); // 19 2731 Draenei uncontrolled (1 - yes, 0 - no)
8407 data << uint32(0xaaa) << uint32(0x0); // 20 2730 Mage Tower - Alliance control
8408 data << uint32(0xaa9) << uint32(0x0); // 21 2729 Mage Tower - Horde control
8409 data << uint32(0xaa8) << uint32(0x1); // 22 2728 Mage Tower uncontrolled (1 - yes, 0 - no)
8410 data << uint32(0xaa7) << uint32(0x0); // 23 2727 Fel Reaver - Horde control
8411 data << uint32(0xaa6) << uint32(0x0); // 24 2726 Fel Reaver - Alliance control
8412 data << uint32(0xaa5) << uint32(0x1); // 25 2725 Fel Reaver uncontrolled (1 - yes, 0 - no)
8413 data << uint32(0xaa4) << uint32(0x0); // 26 2724 Boold Elf - Horde control
8414 data << uint32(0xaa3) << uint32(0x0); // 27 2723 Boold Elf - Alliance control
8415 data << uint32(0xaa2) << uint32(0x1); // 28 2722 Boold Elf uncontrolled (1 - yes, 0 - no)
8416 data << uint32(0xac5) << uint32(0x1); // 29 2757 Flag (1 - show, 0 - hide) - doesn't work exactly this way!
8417 data << uint32(0xad2) << uint32(0x1); // 30 2770 Horde top-stats (1 - show, 0 - hide) // 02 -> horde picked up the flag
8418 data << uint32(0xad1) << uint32(0x1); // 31 2769 Alliance top-stats (1 - show, 0 - hide) // 02 -> alliance picked up the flag
8419 data << uint32(0xabe) << uint32(0x0); // 32 2750 Horde resources
8420 data << uint32(0xabd) << uint32(0x0); // 33 2749 Alliance resources
8421 data << uint32(0xa05) << uint32(0x8e); // 34 2565 unk, constant?
8422 data << uint32(0xaa0) << uint32(0x0); // 35 2720 Capturing progress-bar (100 -> empty (only grey), 0 -> blue|red (no grey), default 0)
8423 data << uint32(0xa9f) << uint32(0x0); // 36 2719 Capturing progress-bar (0 - left, 100 - right)
8424 data << uint32(0xa9e) << uint32(0x0); // 37 2718 Capturing progress-bar (1 - show, 0 - hide)
8425 data << uint32(0xc0d) << uint32(0x17b); // 38 3085 unk
8426 // and some more ... unknown
8427 }
8428 break;
8429 // any of these needs change! the client remembers the prev setting!
8430 // ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
8431 case 3483: // Hellfire Peninsula
8432 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_HP)
8433 pvp->FillInitialWorldStates(data);
8434 else
8435 {
8436 data << uint32(0x9ba) << uint32(0x1); // 10 // add ally tower main gui icon // maybe should be sent only on login?
8437 data << uint32(0x9b9) << uint32(0x1); // 11 // add horde tower main gui icon // maybe should be sent only on login?
8438 data << uint32(0x9b5) << uint32(0x0); // 12 // show neutral broken hill icon // 2485
8439 data << uint32(0x9b4) << uint32(0x1); // 13 // show icon above broken hill // 2484
8440 data << uint32(0x9b3) << uint32(0x0); // 14 // show ally broken hill icon // 2483
8441 data << uint32(0x9b2) << uint32(0x0); // 15 // show neutral overlook icon // 2482
8442 data << uint32(0x9b1) << uint32(0x1); // 16 // show the overlook arrow // 2481
8443 data << uint32(0x9b0) << uint32(0x0); // 17 // show ally overlook icon // 2480
8444 data << uint32(0x9ae) << uint32(0x0); // 18 // horde pvp objectives captured // 2478
8445 data << uint32(0x9ac) << uint32(0x0); // 19 // ally pvp objectives captured // 2476
8446 data << uint32(2475) << uint32(100); //: ally / horde slider grey area // show only in direct vicinity!
8447 data << uint32(2474) << uint32(50); //: ally / horde slider percentage, 100 for ally, 0 for horde // show only in direct vicinity!
8448 data << uint32(2473) << uint32(0); //: ally / horde slider display // show only in direct vicinity!
8449 data << uint32(0x9a8) << uint32(0x0); // 20 // show the neutral stadium icon // 2472
8450 data << uint32(0x9a7) << uint32(0x0); // 21 // show the ally stadium icon // 2471
8451 data << uint32(0x9a6) << uint32(0x1); // 22 // show the horde stadium icon // 2470
8452 }
8453 break;
8454 case 3518: // Nagrand
8455 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_NA)
8456 pvp->FillInitialWorldStates(data);
8457 else
8458 {
8459 data << uint32(2503) << uint32(0x0); // 10
8460 data << uint32(2502) << uint32(0x0); // 11
8461 data << uint32(2493) << uint32(0x0); // 12
8462 data << uint32(2491) << uint32(0x0); // 13
8463
8464 data << uint32(2495) << uint32(0x0); // 14
8465 data << uint32(2494) << uint32(0x0); // 15
8466 data << uint32(2497) << uint32(0x0); // 16
8467
8468 data << uint32(2762) << uint32(0x0); // 17
8469 data << uint32(2662) << uint32(0x0); // 18
8470 data << uint32(2663) << uint32(0x0); // 19
8471 data << uint32(2664) << uint32(0x0); // 20
8472
8473 data << uint32(2760) << uint32(0x0); // 21
8474 data << uint32(2670) << uint32(0x0); // 22
8475 data << uint32(2668) << uint32(0x0); // 23
8476 data << uint32(2669) << uint32(0x0); // 24
8477
8478 data << uint32(2761) << uint32(0x0); // 25
8479 data << uint32(2667) << uint32(0x0); // 26
8480 data << uint32(2665) << uint32(0x0); // 27
8481 data << uint32(2666) << uint32(0x0); // 28
8482
8483 data << uint32(2763) << uint32(0x0); // 29
8484 data << uint32(2659) << uint32(0x0); // 30
8485 data << uint32(2660) << uint32(0x0); // 31
8486 data << uint32(2661) << uint32(0x0); // 32
8487
8488 data << uint32(2671) << uint32(0x0); // 33
8489 data << uint32(2676) << uint32(0x0); // 34
8490 data << uint32(2677) << uint32(0x0); // 35
8491 data << uint32(2672) << uint32(0x0); // 36
8492 data << uint32(2673) << uint32(0x0); // 37
8493 }
8494 break;
8495 case 3519: // Terokkar Forest
8496 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_TF)
8497 pvp->FillInitialWorldStates(data);
8498 else
8499 {
8500 data << uint32(0xa41) << uint32(0x0); // 10 // 2625 capture bar pos
8501 data << uint32(0xa40) << uint32(0x14); // 11 // 2624 capture bar neutral
8502 data << uint32(0xa3f) << uint32(0x0); // 12 // 2623 show capture bar
8503 data << uint32(0xa3e) << uint32(0x0); // 13 // 2622 horde towers controlled
8504 data << uint32(0xa3d) << uint32(0x5); // 14 // 2621 ally towers controlled
8505 data << uint32(0xa3c) << uint32(0x0); // 15 // 2620 show towers controlled
8506 data << uint32(0xa88) << uint32(0x0); // 16 // 2696 SE Neu
8507 data << uint32(0xa87) << uint32(0x0); // 17 // SE Horde
8508 data << uint32(0xa86) << uint32(0x0); // 18 // SE Ally
8509 data << uint32(0xa85) << uint32(0x0); // 19 //S Neu
8510 data << uint32(0xa84) << uint32(0x0); // 20 S Horde
8511 data << uint32(0xa83) << uint32(0x0); // 21 S Ally
8512 data << uint32(0xa82) << uint32(0x0); // 22 NE Neu
8513 data << uint32(0xa81) << uint32(0x0); // 23 NE Horde
8514 data << uint32(0xa80) << uint32(0x0); // 24 NE Ally
8515 data << uint32(0xa7e) << uint32(0x0); // 25 // 2686 N Neu
8516 data << uint32(0xa7d) << uint32(0x0); // 26 N Horde
8517 data << uint32(0xa7c) << uint32(0x0); // 27 N Ally
8518 data << uint32(0xa7b) << uint32(0x0); // 28 NW Ally
8519 data << uint32(0xa7a) << uint32(0x0); // 29 NW Horde
8520 data << uint32(0xa79) << uint32(0x0); // 30 NW Neutral
8521 data << uint32(0x9d0) << uint32(0x5); // 31 // 2512 locked time remaining seconds first digit
8522 data << uint32(0x9ce) << uint32(0x0); // 32 // 2510 locked time remaining seconds second digit
8523 data << uint32(0x9cd) << uint32(0x0); // 33 // 2509 locked time remaining minutes
8524 data << uint32(0x9cc) << uint32(0x0); // 34 // 2508 neutral locked time show
8525 data << uint32(0xad0) << uint32(0x0); // 35 // 2768 horde locked time show
8526 data << uint32(0xacf) << uint32(0x1); // 36 // 2767 ally locked time show
8527 }
8528 break;
8529 case 3521: // Zangarmarsh
8530 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_ZM)
8531 pvp->FillInitialWorldStates(data);
8532 else
8533 {
8534 data << uint32(0x9e1) << uint32(0x0); // 10 //2529
8535 data << uint32(0x9e0) << uint32(0x0); // 11
8536 data << uint32(0x9df) << uint32(0x0); // 12
8537 data << uint32(0xa5d) << uint32(0x1); // 13 //2653
8538 data << uint32(0xa5c) << uint32(0x0); // 14 //2652 east beacon neutral
8539 data << uint32(0xa5b) << uint32(0x1); // 15 horde
8540 data << uint32(0xa5a) << uint32(0x0); // 16 ally
8541 data << uint32(0xa59) << uint32(0x1); // 17 // 2649 Twin spire graveyard horde 12???
8542 data << uint32(0xa58) << uint32(0x0); // 18 ally 14 ???
8543 data << uint32(0xa57) << uint32(0x0); // 19 neutral 7???
8544 data << uint32(0xa56) << uint32(0x0); // 20 // 2646 west beacon neutral
8545 data << uint32(0xa55) << uint32(0x1); // 21 horde
8546 data << uint32(0xa54) << uint32(0x0); // 22 ally
8547 data << uint32(0x9e7) << uint32(0x0); // 23 // 2535
8548 data << uint32(0x9e6) << uint32(0x0); // 24
8549 data << uint32(0x9e5) << uint32(0x0); // 25
8550 data << uint32(0xa00) << uint32(0x0); // 26 // 2560
8551 data << uint32(0x9ff) << uint32(0x1); // 27
8552 data << uint32(0x9fe) << uint32(0x0); // 28
8553 data << uint32(0x9fd) << uint32(0x0); // 29
8554 data << uint32(0x9fc) << uint32(0x1); // 30
8555 data << uint32(0x9fb) << uint32(0x0); // 31
8556 data << uint32(0xa62) << uint32(0x0); // 32 // 2658
8557 data << uint32(0xa61) << uint32(0x1); // 33
8558 data << uint32(0xa60) << uint32(0x1); // 34
8559 data << uint32(0xa5f) << uint32(0x0); // 35
8560 }
8561 break;
8562 case 3698: // Nagrand Arena
8563 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_NA)
8564 bg->FillInitialWorldStates(data);
8565 else
8566 {
8567 data << uint32(0xa0f) << uint32(0x0); // 7
8568 data << uint32(0xa10) << uint32(0x0); // 8
8569 data << uint32(0xa11) << uint32(0x0); // 9 show
8570 }
8571 break;
8572 case 3702: // Blade's Edge Arena
8573 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_BE)
8574 bg->FillInitialWorldStates(data);
8575 else
8576 {
8577 data << uint32(0x9f0) << uint32(0x0); // 7 gold
8578 data << uint32(0x9f1) << uint32(0x0); // 8 green
8579 data << uint32(0x9f3) << uint32(0x0); // 9 show
8580 }
8581 break;
8582 case 3968: // Ruins of Lordaeron
8583 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RL)
8584 bg->FillInitialWorldStates(data);
8585 else
8586 {
8587 data << uint32(0xbb8) << uint32(0x0); // 7 gold
8588 data << uint32(0xbb9) << uint32(0x0); // 8 green
8589 data << uint32(0xbba) << uint32(0x0); // 9 show
8590 }
8591 break;
8592 case 4378: // Dalaran Sewers
8593 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_DS)
8594 bg->FillInitialWorldStates(data);
8595 else
8596 {
8597 data << uint32(3601) << uint32(0x0); // 7 gold
8598 data << uint32(3600) << uint32(0x0); // 8 green
8599 data << uint32(3610) << uint32(0x0); // 9 show
8600 }
8601 break;
8602 case 4384: // Strand of the Ancients
8603 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA)
8604 bg->FillInitialWorldStates(data);
8605 else
8606 {
8607 // 1-3 A defend, 4-6 H defend, 7-9 unk defend, 1 - ok, 2 - half destroyed, 3 - destroyed
8608 data << uint32(0xf09) << uint32(0x0); // 7 3849 Gate of Temple
8609 data << uint32(0xe36) << uint32(0x0); // 8 3638 Gate of Yellow Moon
8610 data << uint32(0xe27) << uint32(0x0); // 9 3623 Gate of Green Emerald
8611 data << uint32(0xe24) << uint32(0x0); // 10 3620 Gate of Blue Sapphire
8612 data << uint32(0xe21) << uint32(0x0); // 11 3617 Gate of Red Sun
8613 data << uint32(0xe1e) << uint32(0x0); // 12 3614 Gate of Purple Ametyst
8614
8615 data << uint32(0xdf3) << uint32(0x0); // 13 3571 bonus timer (1 - on, 0 - off)
8616 data << uint32(0xded) << uint32(0x0); // 14 3565 Horde Attacker
8617 data << uint32(0xdec) << uint32(0x0); // 15 3564 Alliance Attacker
8618 // End Round (timer), better explain this by example, eg. ends in 19:59 -> A:BC
8619 data << uint32(0xde9) << uint32(0x0); // 16 3561 C
8620 data << uint32(0xde8) << uint32(0x0); // 17 3560 B
8621 data << uint32(0xde7) << uint32(0x0); // 18 3559 A
8622 data << uint32(0xe35) << uint32(0x0); // 19 3637 East g - Horde control
8623 data << uint32(0xe34) << uint32(0x0); // 20 3636 West g - Horde control
8624 data << uint32(0xe33) << uint32(0x0); // 21 3635 South g - Horde control
8625 data << uint32(0xe32) << uint32(0x0); // 22 3634 East g - Alliance control
8626 data << uint32(0xe31) << uint32(0x0); // 23 3633 West g - Alliance control
8627 data << uint32(0xe30) << uint32(0x0); // 24 3632 South g - Alliance control
8628 data << uint32(0xe2f) << uint32(0x0); // 25 3631 Chamber of Ancients - Horde control
8629 data << uint32(0xe2e) << uint32(0x0); // 26 3630 Chamber of Ancients - Alliance control
8630 data << uint32(0xe2d) << uint32(0x0); // 27 3629 Beach1 - Horde control
8631 data << uint32(0xe2c) << uint32(0x0); // 28 3628 Beach2 - Horde control
8632 data << uint32(0xe2b) << uint32(0x0); // 29 3627 Beach1 - Alliance control
8633 data << uint32(0xe2a) << uint32(0x0); // 30 3626 Beach2 - Alliance control
8634 // and many unks...
8635 }
8636 break;
8637 case 4406: // Ring of Valor
8638 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RV)
8639 bg->FillInitialWorldStates(data);
8640 else
8641 {
8642 data << uint32(0xe10) << uint32(0x0); // 7 gold
8643 data << uint32(0xe11) << uint32(0x0); // 8 green
8644 data << uint32(0xe1a) << uint32(0x0); // 9 show
8645 }
8646 break;
8647 case 4710: // Isle of Conquest
8648 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC)
8649 bg->FillInitialWorldStates(data);
8650 else
8651 {
8652 data << uint32(4221) << uint32(1); // 7 BG_IC_ALLIANCE_RENFORT_SET
8653 data << uint32(4222) << uint32(1); // 8 BG_IC_HORDE_RENFORT_SET
8654 data << uint32(4226) << uint32(300); // 9 BG_IC_ALLIANCE_RENFORT
8655 data << uint32(4227) << uint32(300); // 10 BG_IC_HORDE_RENFORT
8656 data << uint32(4322) << uint32(1); // 11 BG_IC_GATE_FRONT_H_WS_OPEN
8657 data << uint32(4321) << uint32(1); // 12 BG_IC_GATE_WEST_H_WS_OPEN
8658 data << uint32(4320) << uint32(1); // 13 BG_IC_GATE_EAST_H_WS_OPEN
8659 data << uint32(4323) << uint32(1); // 14 BG_IC_GATE_FRONT_A_WS_OPEN
8660 data << uint32(4324) << uint32(1); // 15 BG_IC_GATE_WEST_A_WS_OPEN
8661 data << uint32(4325) << uint32(1); // 16 BG_IC_GATE_EAST_A_WS_OPEN
8662 data << uint32(4317) << uint32(1); // 17 unknown
8663
8664 data << uint32(4301) << uint32(1); // 18 BG_IC_DOCKS_UNCONTROLLED
8665 data << uint32(4296) << uint32(1); // 19 BG_IC_HANGAR_UNCONTROLLED
8666 data << uint32(4306) << uint32(1); // 20 BG_IC_QUARRY_UNCONTROLLED
8667 data << uint32(4311) << uint32(1); // 21 BG_IC_REFINERY_UNCONTROLLED
8668 data << uint32(4294) << uint32(1); // 22 BG_IC_WORKSHOP_UNCONTROLLED
8669 data << uint32(4243) << uint32(1); // 23 unknown
8670 data << uint32(4345) << uint32(1); // 24 unknown
8671 }
8672 break;
8673 // The Ruby Sanctum
8674 case 4987:
8675 if (instance && mapid == 724)
8676 instance->FillInitialWorldStates(data);
8677 else
8678 {
8679 data << uint32(5049) << uint32(50); // 9 WORLDSTATE_CORPOREALITY_MATERIAL
8680 data << uint32(5050) << uint32(50); // 10 WORLDSTATE_CORPOREALITY_TWILIGHT
8681 data << uint32(5051) << uint32(0); // 11 WORLDSTATE_CORPOREALITY_TOGGLE
8682 }
8683 break;
8684 // Icecrown Citadel
8685 case 4812:
8686 if (instance && mapid == 631)
8687 instance->FillInitialWorldStates(data);
8688 else
8689 {
8690 data << uint32(4903) << uint32(0); // 9 WORLDSTATE_SHOW_TIMER (Blood Quickening weekly)
8691 data << uint32(4904) << uint32(30); // 10 WORLDSTATE_EXECUTION_TIME
8692 data << uint32(4940) << uint32(0); // 11 WORLDSTATE_SHOW_ATTEMPTS
8693 data << uint32(4941) << uint32(50); // 12 WORLDSTATE_ATTEMPTS_REMAINING
8694 data << uint32(4942) << uint32(50); // 13 WORLDSTATE_ATTEMPTS_MAX
8695 }
8696 break;
8697 // The Culling of Stratholme
8698 case 4100:
8699 if (instance && mapid == 595)
8700 instance->FillInitialWorldStates(data);
8701 else
8702 {
8703 data << uint32(3479) << uint32(0); // 9 WORLDSTATE_SHOW_CRATES
8704 data << uint32(3480) << uint32(0); // 10 WORLDSTATE_CRATES_REVEALED
8705 data << uint32(3504) << uint32(0); // 11 WORLDSTATE_WAVE_COUNT
8706 data << uint32(3931) << uint32(25); // 12 WORLDSTATE_TIME_GUARDIAN
8707 data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW
8708 }
8709 break;
8710 // The Oculus
8711 case 4228:
8712 if (instance && mapid == 578)
8713 instance->FillInitialWorldStates(data);
8714 else
8715 {
8716 data << uint32(3524) << uint32(0); // 9 WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW
8717 data << uint32(3486) << uint32(0); // 10 WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT
8718 }
8719 break;
8720 // Ulduar
8721 case 4273:
8722 if (instance && mapid == 603)
8723 instance->FillInitialWorldStates(data);
8724 else
8725 {
8726 data << uint32(4132) << uint32(0); // 9 WORLDSTATE_ALGALON_TIMER_ENABLED
8727 data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER
8728 }
8729 break;
8730 // Halls of Refection
8731 case 4820:
8732 if (instance && mapid == 668)
8733 instance->FillInitialWorldStates(data);
8734 else
8735 {
8736 data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
8737 data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
8738 }
8739 break;
8740 // Scarlet Enclave (DK starting zone)
8741 case 4298:
8742 // Get Mograine, GUID and ENTRY should NEVER change
8743 if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
8744 {
8745 if (CreatureAI* mograineAI = mograine->AI())
8746 {
8747 data << uint32(3590) << uint32(mograineAI->GetData(3590));
8748 data << uint32(3591) << uint32(mograineAI->GetData(3591));
8749 data << uint32(3592) << uint32(mograineAI->GetData(3592));
8750 data << uint32(3603) << uint32(mograineAI->GetData(3603));
8751 data << uint32(3604) << uint32(mograineAI->GetData(3604));
8752 data << uint32(3605) << uint32(mograineAI->GetData(3605));
8753 }
8754 }
8755 break;
8756 // Wintergrasp
8757 case 4197:
8758 if (bf && bf->GetTypeId() == BATTLEFIELD_WG)
8759 {
8760 bf->FillInitialWorldStates(data);
8761 break;
8762 }
8763 [[fallthrough]];
8764 default:
8765 data << uint32(0x914) << uint32(0x0); // 7
8766 data << uint32(0x913) << uint32(0x0); // 8
8767 data << uint32(0x912) << uint32(0x0); // 9
8768 data << uint32(0x915) << uint32(0x0); // 10
8769 break;
8770 }
8771 }
8772
8773 uint16 length = (data.wpos() - countPos) / 8;
8774 data.put<uint16>(countPos, length);
8775
8776 GetSession()->SendPacket(&data);
8779}
@ BATTLEFIELD_WG
Definition: Battlefield.h:31
@ OUTDOOR_PVP_SI
Definition: OutdoorPvP.h:34
@ OUTDOOR_PVP_TF
Definition: OutdoorPvP.h:32
@ OUTDOOR_PVP_ZM
Definition: OutdoorPvP.h:33
@ OUTDOOR_PVP_EP
Definition: OutdoorPvP.h:35
@ OUTDOOR_PVP_NA
Definition: OutdoorPvP.h:31
@ OUTDOOR_PVP_HP
Definition: OutdoorPvP.h:30
@ CONFIG_ARENA_SEASON_ID
Definition: IWorld.h:331
@ CONFIG_ARENA_SEASON_IN_PROGRESS
Definition: IWorld.h:124
@ BATTLEGROUND_IC
Definition: SharedDefines.h:3492
@ BATTLEGROUND_WS
Definition: SharedDefines.h:3482
@ BATTLEGROUND_EY
Definition: SharedDefines.h:3487
@ BATTLEGROUND_AV
Definition: SharedDefines.h:3481
@ BATTLEGROUND_BE
Definition: SharedDefines.h:3485
@ BATTLEGROUND_RV
Definition: SharedDefines.h:3491
@ BATTLEGROUND_NA
Definition: SharedDefines.h:3484
@ BATTLEGROUND_DS
Definition: SharedDefines.h:3490
@ BATTLEGROUND_SA
Definition: SharedDefines.h:3489
@ BATTLEGROUND_AB
Definition: SharedDefines.h:3483
@ BATTLEGROUND_RL
Definition: SharedDefines.h:3488
@ SMSG_INIT_WORLD_STATES
Definition: Opcodes.h:736
Definition: CreatureAI.h:71
virtual void FillInitialWorldStates(WorldPacket &)=0
uint32 GetTypeId()
Definition: Battlefield.h:243
virtual void FillInitialWorldStates(WorldPacket &)
Definition: Battleground.h:443
BattlegroundTypeId GetBgTypeID(bool GetRandom=false) const
Definition: Battleground.h:324
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
void SendBGWeekendWorldStates()
Definition: Player.cpp:8781
void SendBattlefieldWorldStates()
Definition: Player.cpp:8796
static std::unordered_map< int, bgZoneRef > bgZoneIdToFillWorldStates
Definition: Player.h:2593
Definition: InstanceScript.h:142
virtual void FillInitialWorldStates(WorldPacket &)
Definition: InstanceScript.h:257
Definition: OutdoorPvP.h:186
virtual void FillInitialWorldStates(WorldPacket &)
Definition: OutdoorPvP.h:203
uint32 GetTypeId() const
Definition: OutdoorPvP.h:238

References BATTLEFIELD_WG, BATTLEGROUND_AB, BATTLEGROUND_AV, BATTLEGROUND_BE, BATTLEGROUND_DS, BATTLEGROUND_EY, BATTLEGROUND_IC, BATTLEGROUND_NA, BATTLEGROUND_RL, BATTLEGROUND_RV, BATTLEGROUND_SA, BATTLEGROUND_WS, bgZoneIdToFillWorldStates, CONFIG_ARENA_SEASON_ID, CONFIG_ARENA_SEASON_IN_PROGRESS, Battleground::FillInitialWorldStates(), InstanceScript::FillInitialWorldStates(), OutdoorPvP::FillInitialWorldStates(), Battlefield::FillInitialWorldStates(), GetBattleground(), Battleground::GetBgTypeID(), ObjectAccessor::GetCreature(), WorldObject::GetInstanceScript(), WorldLocation::GetMapId(), GetSession(), Battlefield::GetTypeId(), OutdoorPvP::GetTypeId(), LOG_DEBUG, OUTDOOR_PVP_EP, OUTDOOR_PVP_HP, OUTDOOR_PVP_NA, OUTDOOR_PVP_SI, OUTDOOR_PVP_TF, OUTDOOR_PVP_ZM, ByteBuffer::put(), sBattlefieldMgr, SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), WorldSession::SendPacket(), SMSG_INIT_WORLD_STATES, sOutdoorPvPMgr, sWorld, and ByteBuffer::wpos().

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), and UpdateZone().

◆ SendInstanceResetWarning()

void Player::SendInstanceResetWarning ( uint32  mapid,
Difficulty  difficulty,
uint32  time,
bool  onEnterMap 
)
11689{
11690 // pussywizard:
11691 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(GetGUID(), mapid, difficulty);
11692 if (bind && bind->extended)
11693 {
11694 if (!onEnterMap) // extended id player shouldn't be warned about lock expiration
11695 return;
11696 time += (bind->save->GetExtendedResetTime() - bind->save->GetResetTime()); // add lockout period to the time left
11697 }
11698
11699 // type of warning, based on the time remaining until reset
11700 uint32 type;
11701 if (time > 3600)
11702 type = RAID_INSTANCE_WELCOME;
11703 else if (time > 900)
11705 else if (time > 300)
11707 else
11709
11710 WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4 + 4 + 4 + 4);
11711 data << uint32(type);
11712 data << uint32(mapid);
11713 data << uint32(difficulty); // difficulty
11714 data << uint32(time);
11715 if (type == RAID_INSTANCE_WELCOME)
11716 {
11717 data << uint8(bind && bind->perm); // is locked
11718 data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0
11719 }
11720 GetSession()->SendPacket(&data);
11721}
@ RAID_INSTANCE_WARNING_MIN
Definition: Player.h:804
@ RAID_INSTANCE_WARNING_MIN_SOON
Definition: Player.h:805
@ RAID_INSTANCE_WARNING_HOURS
Definition: Player.h:803
@ RAID_INSTANCE_WELCOME
Definition: Player.h:806
@ SMSG_RAID_INSTANCE_MESSAGE
Definition: Opcodes.h:792
Definition: InstanceSaveMgr.h:39
InstanceSave * save
Definition: InstanceSaveMgr.h:40
bool extended
Definition: InstanceSaveMgr.h:42
bool perm
Definition: InstanceSaveMgr.h:41
time_t GetExtendedResetTime() const
Definition: InstanceSaveMgr.h:76
time_t GetResetTime() const
Definition: InstanceSaveMgr.h:75

References InstancePlayerBind::extended, InstanceSave::GetExtendedResetTime(), Object::GetGUID(), InstanceSave::GetResetTime(), GetSession(), InstancePlayerBind::perm, RAID_INSTANCE_WARNING_HOURS, RAID_INSTANCE_WARNING_MIN, RAID_INSTANCE_WARNING_MIN_SOON, RAID_INSTANCE_WELCOME, InstancePlayerBind::save, WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_RAID_INSTANCE_MESSAGE.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendItemDurations()

void Player::SendItemDurations ( )
4758{
4759 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
4760 {
4761 (*itr)->SendTimeUpdate(this);
4762 }
4763}

References m_itemDuration.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendItemRetrievalMail() [1/2]

void Player::SendItemRetrievalMail ( std::vector< std::pair< uint32, uint32 > >  mailItems)
445{
446 if (mailItems.empty())
447 {
448 // Skip send if empty items
449 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Attempt to send almost with items without items. Player {}", GetGUID().ToString());
450 return;
451 }
452
453 using SendMailTempateVector = std::vector<std::pair<uint32, uint32>>;
454
455 std::vector<SendMailTempateVector> allItems;
456
457 auto AddMailItem = [&allItems](uint32 itemEntry, uint32 itemCount)
458 {
459 SendMailTempateVector toSendItems;
460
461 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemEntry);
462 if (!itemTemplate)
463 {
464 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Item id {} is invalid", itemEntry);
465 return;
466 }
467
468 if (itemCount < 1 || (itemTemplate->MaxCount > 0 && itemCount > static_cast<uint32>(itemTemplate->MaxCount)))
469 {
470 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Incorrect item count ({}) for item id {}", itemEntry, itemCount);
471 return;
472 }
473
474 while (itemCount > itemTemplate->GetMaxStackSize())
475 {
476 if (toSendItems.size() <= MAX_MAIL_ITEMS)
477 {
478 toSendItems.emplace_back(itemEntry, itemTemplate->GetMaxStackSize());
479 itemCount -= itemTemplate->GetMaxStackSize();
480 }
481 else
482 {
483 allItems.emplace_back(toSendItems);
484 toSendItems.clear();
485 }
486 }
487
488 toSendItems.emplace_back(itemEntry, itemCount);
489 allItems.emplace_back(toSendItems);
490 };
491
492 for (auto& [itemEntry, itemCount] : mailItems)
493 {
494 AddMailItem(itemEntry, itemCount);
495 }
496
497 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
498
499 for (auto const& items : allItems)
500 {
501 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
502 MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.
503
504 for (auto const& [itemEntry, itemCount] : items)
505 {
506 if (Item* mailItem = Item::CreateItem(itemEntry, itemCount))
507 {
508 mailItem->SaveToDB(trans);
509 draft.AddItem(mailItem);
510 }
511 }
512
513 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
514 }
515
516 CharacterDatabase.CommitTransaction(trans);
517}

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), LOG_ERROR, MAIL_CREATURE, MAX_MAIL_ITEMS, ItemTemplate::MaxCount, MailDraft::SendMailTo(), sObjectMgr, and Position::ToString().

◆ SendItemRetrievalMail() [2/2]

void Player::SendItemRetrievalMail ( uint32  itemEntry,
uint32  count 
)

◆ SendLearnPacket()

void Player::SendLearnPacket ( uint32  spellId,
bool  learn 
)
3019{
3020 if (learn)
3021 {
3023 data << uint32(spellId);
3024 data << uint16(0);
3025 GetSession()->SendPacket(&data);
3026 }
3027 else
3028 {
3030 data << uint32(spellId);
3031 GetSession()->SendPacket(&data);
3032 }
3033}
@ SMSG_REMOVED_SPELL
Definition: Opcodes.h:545
@ SMSG_LEARNED_SPELL
Definition: Opcodes.h:329

References GetSession(), WorldSession::SendPacket(), SMSG_LEARNED_SPELL, and SMSG_REMOVED_SPELL.

Referenced by _addSpell(), ActivateSpec(), addTalent(), Spell::EffectApplyGlyph(), WorldSession::HandleRemoveGlyph(), learnSpell(), LearnTalent(), removeSpell(), and resetTalents().

◆ SendLogXPGain()

void Player::SendLogXPGain ( uint32  GivenXP,
Unit victim,
uint32  BonusXP,
bool  recruitAFriend = false,
float  group_rate = 1.0f 
)
2352{
2353 WorldPacket data(SMSG_LOG_XPGAIN, 22); // guess size?
2354 data << (victim ? victim->GetGUID() : ObjectGuid::Empty); // guid
2355 data << uint32(GivenXP + BonusXP); // given experience
2356 data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
2357
2358 if (victim)
2359 {
2360 data << uint32(GivenXP); // experience without bonus
2361
2362 // should use group_rate here but can't figure out how
2363 data << float(1); // 1 - none 0 - 100% group bonus output
2364 }
2365
2366 data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
2367 GetSession()->SendPacket(&data);
2368}
@ SMSG_LOG_XPGAIN
Definition: Opcodes.h:494

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), and SMSG_LOG_XPGAIN.

Referenced by GiveXP().

◆ SendLoot()

void Player::SendLoot ( ObjectGuid  guid,
LootType  loot_type 
)
7730{
7731 if (ObjectGuid lguid = GetLootGUID())
7732 m_session->DoLootRelease(lguid);
7733
7734 Loot* loot = 0;
7735 PermissionTypes permission = ALL_PERMISSION;
7736
7737 LOG_DEBUG("loot", "Player::SendLoot");
7738
7739 // remove FD and invisibility at all loots
7740 constexpr std::array<AuraType, 2> toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH};
7741 for (const auto& aura : toRemove)
7742 {
7743 RemoveAurasByType(aura);
7744 }
7745 // remove stealth only if looting a corpse
7746 if (loot_type == LOOT_CORPSE && !guid.IsItem())
7747 {
7749 }
7750
7751 if (guid.IsGameObject())
7752 {
7753 LOG_DEBUG("loot", "guid.IsGameObject");
7754 GameObject* go = GetMap()->GetGameObject(guid);
7755
7756 // not check distance for GO in case owned GO (fishing bobber case, for example)
7757 // And permit out of range GO with no owner in case fishing hole
7758 if (!go || (loot_type != LOOT_FISHINGHOLE && ((loot_type != LOOT_FISHING && loot_type != LOOT_FISHING_JUNK) || go->GetOwnerGUID() != GetGUID()) && !go->IsWithinDistInMap(this)) || (loot_type == LOOT_CORPSE && go->GetRespawnTime() && go->isSpawnedByDefault()))
7759 {
7761 SendLootRelease(guid);
7762 return;
7763 }
7764
7765 loot = &go->loot;
7766
7767 // Xinef: loot was generated and respawntime has passed since then, allow to recreate loot
7768 // Xinef: to avoid bugs, this rule covers spawned gameobjects only
7769 if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < GameTime::GetGameTime().count())
7771
7772 if (go->getLootState() == GO_READY)
7773 {
7774 uint32 lootid = go->GetGOInfo()->GetLootId();
7775
7776 //TODO: fix this big hack
7778 if (Battleground* bg = GetBattleground())
7779 if (bg->GetBgTypeID(true) == BATTLEGROUND_AV)
7780 if (!bg->ToBattlegroundAV()->PlayerCanDoMineQuest(go->GetEntry(), GetTeamId()))
7781 {
7783 SendLootRelease(guid);
7784 return;
7785 }
7786
7787 if (lootid)
7788 {
7789 loot->clear();
7790
7791 Group* group = GetGroup();
7792 bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
7793
7794 // check current RR player and get next if necessary
7795 if (groupRules)
7796 group->UpdateLooterGuid(go, true);
7797
7798 loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode(), go);
7800
7801 // get next RR player (for next loot)
7802 if (groupRules && !go->loot.empty())
7803 group->UpdateLooterGuid(go);
7804 }
7805 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
7806 loot->generateMoneyLoot(addon->mingold, addon->maxgold);
7807
7808 if (loot_type == LOOT_FISHING)
7809 go->GetFishLoot(loot, this);
7810 else if (loot_type == LOOT_FISHING_JUNK)
7811 go->GetFishLootJunk(loot, this);
7812
7814 {
7815 if (Group* group = GetGroup())
7816 {
7817 switch (group->GetLootMethod())
7818 {
7819 case GROUP_LOOT:
7820 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7821 group->GroupLoot(loot, go);
7822 break;
7823 case NEED_BEFORE_GREED:
7824 group->NeedBeforeGreed(loot, go);
7825 break;
7826 case MASTER_LOOT:
7827 group->MasterLoot(loot, go);
7828 break;
7829 default:
7830 break;
7831 }
7832 }
7833 }
7834
7835 go->SetLootState(GO_ACTIVATED, this);
7836 }
7837
7838 if (go->getLootState() == GO_ACTIVATED)
7839 {
7840 if (Group* group = GetGroup())
7841 {
7842 switch (group->GetLootMethod())
7843 {
7844 case MASTER_LOOT:
7846 break;
7847 case FREE_FOR_ALL:
7848 permission = ALL_PERMISSION;
7849 break;
7850 case ROUND_ROBIN:
7851 permission = ROUND_ROBIN_PERMISSION;
7852 break;
7853 default:
7854 permission = GROUP_PERMISSION;
7855 break;
7856 }
7857 }
7858 else
7859 permission = ALL_PERMISSION;
7860 }
7861 }
7862 else if (guid.IsItem())
7863 {
7864 Item* item = GetItemByGuid(guid);
7865
7866 if (!item)
7867 {
7868 SendLootRelease(guid);
7869 return;
7870 }
7871
7872 permission = OWNER_PERMISSION;
7873
7874 loot = &item->loot;
7875
7876 // Xinef: Store container id
7877 loot->containerGUID = item->GetGUID();
7878
7879 if (!item->m_lootGenerated && !sLootItemStorage->LoadStoredLoot(item, this))
7880 {
7881 item->m_lootGenerated = true;
7882 loot->clear();
7883
7884 switch (loot_type)
7885 {
7886 case LOOT_DISENCHANTING:
7887 loot->FillLoot(item->GetTemplate()->DisenchantID, LootTemplates_Disenchant, this, true);
7888 break;
7889 case LOOT_PROSPECTING:
7890 loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this, true);
7891 break;
7892 case LOOT_MILLING:
7893 loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this, true);
7894 break;
7895 default:
7897 loot->FillLoot(item->GetEntry(), LootTemplates_Item, this, true, loot->gold != 0);
7898
7899 // Xinef: Add to storage
7900 if (loot->gold > 0 || loot->unlootedCount > 0)
7901 sLootItemStorage->AddNewStoredLoot(loot, this);
7902
7903 break;
7904 }
7905 }
7906 }
7907 else if (guid.IsCorpse()) // remove insignia
7908 {
7909 Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
7910
7911 if (!bones || !(loot_type == LOOT_CORPSE || loot_type == LOOT_INSIGNIA) || bones->GetType() != CORPSE_BONES || !bones->HasFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE))
7912 {
7913 SendLootRelease(guid);
7914 return;
7915 }
7916
7917 loot = &bones->loot;
7918
7919 if (loot->loot_type == LOOT_NONE)
7920 {
7921 uint32 pLevel = bones->loot.gold;
7922 bones->loot.clear();
7923
7924 loot->FillLoot(GetTeamId(), LootTemplates_Player, this, true);
7925
7926 // It may need a better formula
7927 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver
7928 bones->loot.gold = uint32(urand(50, 150) * 0.016f * pow(float(pLevel) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
7929 }
7930
7931 if (bones->lootRecipient != this)
7932 permission = NONE_PERMISSION;
7933 else
7934 permission = OWNER_PERMISSION;
7935 }
7936 else
7937 {
7938 Creature* creature = GetMap()->GetCreature(guid);
7939
7940 // must be in range and creature must be alive for pickpocket and must be dead for another loot
7941 if (!creature || creature->IsAlive() != (loot_type == LOOT_PICKPOCKETING) || !creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
7942 {
7943 SendLootRelease(guid);
7944 return;
7945 }
7946
7947 if (loot_type == LOOT_PICKPOCKETING && IsFriendlyTo(creature))
7948 {
7949 SendLootRelease(guid);
7950 return;
7951 }
7952
7953 loot = &creature->loot;
7954
7955 if (loot_type == LOOT_PICKPOCKETING)
7956 {
7957 if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
7958 {
7959 if (creature->CanGeneratePickPocketLoot())
7960 {
7961 creature->SetPickPocketLootTime();
7962 loot->clear();
7963
7964 if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
7965 loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true);
7966
7967 // Generate extra money for pick pocket loot
7968 const uint32 a = urand(0, creature->GetLevel() / 2);
7969 const uint32 b = urand(0, GetLevel() / 2);
7970 loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
7971 permission = OWNER_PERMISSION;
7972 }
7973 else
7974 {
7975 permission = NONE_PERMISSION;
7977 return;
7978 }
7979 }
7980 }
7981 else
7982 {
7983 // Xinef: Exploit fix
7984 if (!creature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
7985 {
7987 return;
7988 }
7989
7990 // the player whose group may loot the corpse
7991 Player* recipient = creature->GetLootRecipient();
7992 Group* recipientGroup = creature->GetLootRecipientGroup();
7993 if (!recipient && !recipientGroup)
7994 return;
7995
7996 if (loot->loot_type == LOOT_NONE)
7997 {
7998 // for creature, loot is filled when creature is killed.
7999 if (recipientGroup)
8000 {
8001 switch (recipientGroup->GetLootMethod())
8002 {
8003 case GROUP_LOOT:
8004 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
8005 recipientGroup->GroupLoot(loot, creature);
8006 break;
8007 case NEED_BEFORE_GREED:
8008 recipientGroup->NeedBeforeGreed(loot, creature);
8009 break;
8010 case MASTER_LOOT:
8011 recipientGroup->MasterLoot(loot, creature);
8012 break;
8013 default:
8014 break;
8015 }
8016 }
8017 }
8018
8019 // if loot is already skinning loot then don't do anything else
8020 if (loot->loot_type == LOOT_SKINNING)
8021 {
8022 loot_type = LOOT_SKINNING;
8023 permission = creature->GetLootRecipientGUID() == GetGUID() ? OWNER_PERMISSION : NONE_PERMISSION;
8024 }
8025 else if (loot_type == LOOT_SKINNING)
8026 {
8027 loot->clear();
8028 loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true);
8029 permission = OWNER_PERMISSION;
8030
8031 //Inform instance if creature is skinned.
8032 if (InstanceScript* mapInstance = creature->GetInstanceScript())
8033 {
8034 mapInstance->CreatureLooted(creature, LOOT_SKINNING);
8035 }
8036
8037 // Xinef: Set new loot recipient
8038 creature->SetLootRecipient(this, false);
8039 }
8040 // set group rights only for loot_type != LOOT_SKINNING
8041 else
8042 {
8043 if (recipientGroup)
8044 {
8045 if (GetGroup() == recipientGroup)
8046 {
8047 switch (recipientGroup->GetLootMethod())
8048 {
8049 case MASTER_LOOT:
8050 permission = recipientGroup->GetMasterLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION;
8051 break;
8052 case FREE_FOR_ALL:
8053 permission = ALL_PERMISSION;
8054 break;
8055 case ROUND_ROBIN:
8056 permission = ROUND_ROBIN_PERMISSION;
8057 break;
8058 default:
8059 permission = GROUP_PERMISSION;
8060 break;
8061 }
8062 }
8063 else
8064 permission = NONE_PERMISSION;
8065 }
8066 else if (recipient == this)
8067 permission = OWNER_PERMISSION;
8068 else
8069 permission = NONE_PERMISSION;
8070 }
8071 }
8072 }
8073
8074 // LOOT_INSIGNIA and LOOT_FISHINGHOLE unsupported by client
8075 switch (loot_type)
8076 {
8077 case LOOT_INSIGNIA:
8078 loot_type = LOOT_SKINNING;
8079 break;
8080 case LOOT_FISHINGHOLE:
8081 loot_type = LOOT_FISHING;
8082 break;
8083 case LOOT_FISHING_JUNK:
8084 loot_type = LOOT_FISHING;
8085 break;
8086 default:
8087 break;
8088 }
8089
8090 // need know merged fishing/corpse loot type for achievements
8091 loot->loot_type = loot_type;
8092
8093 if (!sScriptMgr->OnAllowedToLootContainerCheck(this, guid))
8094 {
8096 return;
8097 }
8098
8099 if (permission != NONE_PERMISSION)
8100 {
8101 SetLootGUID(guid);
8102
8103 WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
8104 data << guid;
8105 data << uint8(loot_type);
8106 data << LootView(*loot, this, permission);
8107
8108 SendDirectMessage(&data);
8109
8110 // add 'this' player as one of the players that are looting 'loot'
8111 loot->AddLooter(GetGUID());
8112
8113 if (loot_type == LOOT_CORPSE && !guid.IsItem())
8115 }
8116 else
8118}
@ SPELL_AURA_MOD_INVISIBILITY
Definition: SpellAuraDefines.h:81
@ SPELL_AURA_FEIGN_DEATH
Definition: SpellAuraDefines.h:129
@ SPELL_AURA_MOD_STEALTH
Definition: SpellAuraDefines.h:79
@ BG_AV_OBJECTID_MINE_N
Definition: BattlegroundAV.h:160
@ BG_AV_OBJECTID_MINE_S
Definition: BattlegroundAV.h:161
@ GAMEOBJECT_BYTES_1
Definition: UpdateFields.h:404
@ GO_ACTIVATED
Definition: GameObject.h:113
@ GO_READY
Definition: GameObject.h:112
@ CORPSE_BONES
Definition: Corpse.h:28
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Player("player_loot_template", "team id", true)
PermissionTypes
Definition: LootMgr.h:67
@ OWNER_PERMISSION
Definition: LootMgr.h:73
@ ALL_PERMISSION
Definition: LootMgr.h:68
@ RESTRICTED_PERMISSION
Definition: LootMgr.h:71
@ NONE_PERMISSION
Definition: LootMgr.h:74
@ ROUND_ROBIN_PERMISSION
Definition: LootMgr.h:72
@ MASTER_PERMISSION
Definition: LootMgr.h:70
@ GROUP_PERMISSION
Definition: LootMgr.h:69
@ LOOT_ERROR_DIDNT_KILL
Definition: LootMgr.h:97
@ LOOT_ERROR_ALREADY_PICKPOCKETED
Definition: LootMgr.h:108
@ LOOT_PICKPOCKETING
Definition: LootMgr.h:82
@ LOOT_MILLING
Definition: LootMgr.h:88
@ LOOT_FISHING_JUNK
Definition: LootMgr.h:92
@ LOOT_CORPSE
Definition: LootMgr.h:81
@ LOOT_FISHING
Definition: LootMgr.h:83
@ LOOT_DISENCHANTING
Definition: LootMgr.h:84
@ LOOT_FISHINGHOLE
Definition: LootMgr.h:90
@ LOOT_NONE
Definition: LootMgr.h:79
@ LOOT_PROSPECTING
Definition: LootMgr.h:87
@ RATE_DROP_MONEY
Definition: IWorld.h:466
@ GAMEOBJECT_TYPE_CHEST
Definition: SharedDefines.h:1563
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ SMSG_LOOT_RESPONSE
Definition: Opcodes.h:382
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:182
Loot loot
Definition: Creature.h:227
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1313
ObjectGuid GetLootRecipientGUID() const
Definition: Creature.h:228
void SetPickPocketLootTime()
Definition: Creature.cpp:3747
Player * GetLootRecipient() const
Definition: Creature.cpp:1299
bool CanGeneratePickPocketLoot() const
Definition: Creature.cpp:3752
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1306
uint32 SkinLootId
Definition: CreatureData.h:229
uint32 pickpocketLootId
Definition: CreatureData.h:228
uint32 GetRespawnDelay() const
Definition: GameObject.h:198
bool IsWithinDistInMap(Player const *player) const
Definition: GameObject.cpp:3003
Loot loot
Definition: GameObject.h:248
LootState getLootState() const
Definition: GameObject.h:225
bool isSpawnedByDefault() const
Definition: GameObject.h:196
time_t GetRespawnTime() const
Definition: GameObject.h:184
uint32 GetLootGenerationTime() const
Definition: GameObject.h:259
void SetLootState(LootState s, Unit *unit=nullptr)
Definition: GameObject.cpp:2442
void GetFishLootJunk(Loot *loot, Player *loot_owner)
Definition: GameObject.cpp:1022
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:174
void GetFishLoot(Loot *loot, Player *loot_owner)
Definition: GameObject.cpp:1002
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition: GameObject.cpp:912
void SetLootGenerationTime()
Definition: GameObject.cpp:2932
uint16 GetLootMode() const
Definition: GameObject.h:229
uint32 type
Definition: GameObjectData.h:34
struct GameObjectTemplate::@227::@232 chest
uint32 groupLootRules
Definition: GameObjectData.h:99
uint32 GetLootId() const
Definition: GameObjectData.h:540
Definition: GameObjectData.h:665
Loot loot
Definition: Item.h:320
uint32 DisenchantID
Definition: ItemTemplate.h:690
uint32 MinMoneyLoot
Definition: ItemTemplate.h:692
uint32 MaxMoneyLoot
Definition: ItemTemplate.h:693
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:119
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2067
bool IsCorpse() const
Definition: ObjectGuid.h:173
bool IsItem() const
Definition: ObjectGuid.h:170
bool IsGameObject() const
Definition: ObjectGuid.h:171
void SendLootRelease(ObjectGuid guid)
Definition: Player.cpp:7722
void SetLootGUID(ObjectGuid guid)
Definition: Player.h:1970
void SendLootError(ObjectGuid guid, LootError error)
Definition: Player.cpp:8120
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10183
void NeedBeforeGreed(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1160
ObjectGuid GetMasterLooterGuid() const
Definition: Group.cpp:2326
void GroupLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1006
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1868
void MasterLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1311
void AddLooter(ObjectGuid GUID)
Definition: LootMgr.h:373
ObjectGuid containerGUID
Definition: LootMgr.h:329
bool empty() const
Definition: LootMgr.h:367
void clear()
Definition: LootMgr.h:343
uint8 unlootedCount
Definition: LootMgr.h:323
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:829
Definition: LootMgr.h:405

References Loot::AddLooter(), ALL_PERMISSION, BATTLEGROUND_AV, BG_AV_OBJECTID_MINE_N, BG_AV_OBJECTID_MINE_S, Creature::CanGeneratePickPocketLoot(), GameObjectTemplate::chest, Loot::clear(), Loot::containerGUID, CORPSE_BONES, CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, ItemTemplate::DisenchantID, WorldSession::DoLootRelease(), Loot::empty(), Loot::FillLoot(), Object::ForceValuesUpdateAtIndex(), FREE_FOR_ALL, GAMEOBJECT_BYTES_1, GAMEOBJECT_TYPE_CHEST, Loot::generateMoneyLoot(), GetBattleground(), ObjectAccessor::GetCorpse(), Map::GetCreature(), Creature::GetCreatureTemplate(), Object::GetEntry(), GameObject::GetFishLoot(), GameObject::GetFishLootJunk(), Map::GetGameObject(), GameTime::GetGameTime(), GameObject::GetGOInfo(), GetGroup(), Object::GetGUID(), WorldObject::GetInstanceScript(), GetItemByGuid(), Unit::GetLevel(), GameObject::GetLootGenerationTime(), GetLootGUID(), GameObjectTemplate::GetLootId(), Group::GetLootMethod(), GameObject::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GameObject::getLootState(), WorldObject::GetMap(), Group::GetMasterLooterGuid(), GameObject::GetOwnerGUID(), GameObject::GetRespawnDelay(), GameObject::GetRespawnTime(), GetTeamId(), Item::GetTemplate(), GameObject::GetTemplateAddon(), Corpse::GetType(), GO_ACTIVATED, GO_READY, Loot::gold, GROUP_LOOT, GROUP_PERMISSION, Group::GroupLoot(), GameObjectTemplate::groupLootRules, Object::HasDynamicFlag(), Object::HasFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), ObjectGuid::IsCorpse(), Unit::IsFriendlyTo(), ObjectGuid::IsGameObject(), ObjectGuid::IsItem(), Loot::isLooted(), GameObject::isSpawnedByDefault(), GameObject::IsWithinDistInMap(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Corpse::loot, Creature::loot, GameObject::loot, Item::loot, LOOT_CORPSE, LOOT_DISENCHANTING, LOOT_ERROR_ALREADY_PICKPOCKETED, LOOT_ERROR_DIDNT_KILL, LOOT_FISHING, LOOT_FISHING_JUNK, LOOT_FISHINGHOLE, LOOT_INSIGNIA, LOOT_MILLING, LOOT_NONE, LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_SKINNING, Loot::loot_type, Corpse::lootRecipient, LootTemplates_Disenchant, LootTemplates_Gameobject, LootTemplates_Item, LootTemplates_Milling, LootTemplates_Pickpocketing, LootTemplates_Player, LootTemplates_Prospecting, LootTemplates_Skinning, Item::m_lootGenerated, m_session, MASTER_LOOT, MASTER_PERMISSION, Group::MasterLoot(), ItemTemplate::MaxMoneyLoot, ItemTemplate::MinMoneyLoot, NEED_BEFORE_GREED, Group::NeedBeforeGreed(), NONE_PERMISSION, OWNER_PERMISSION, CreatureTemplate::pickpocketLootId, RATE_DROP_MONEY, Unit::RemoveAurasByType(), RESTRICTED_PERMISSION, ROUND_ROBIN, ROUND_ROBIN_PERMISSION, SendDirectMessage(), SendLootError(), SendLootRelease(), GameObject::SetLootGenerationTime(), SetLootGUID(), Creature::SetLootRecipient(), GameObject::SetLootState(), Creature::SetPickPocketLootTime(), Unit::SetUnitFlag(), CreatureTemplate::SkinLootId, sLootItemStorage, SMSG_LOOT_RESPONSE, SPELL_AURA_FEIGN_DEATH, SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_MOD_STEALTH, sScriptMgr, sWorld, GameObjectTemplate::type, UNIT_DYNFLAG_LOOTABLE, UNIT_FLAG_LOOTING, Loot::unlootedCount, Group::UpdateLooterGuid(), and urand().

Referenced by Spell::EffectMilling(), Spell::EffectPickPocket(), Spell::EffectProspecting(), Spell::EffectSkinning(), WorldSession::HandleLootOpcode(), WorldSession::HandleOpenItemOpcode(), go_hive_pod::OnGossipHello(), RemovedInsignia(), Spell::SendLoot(), and GameObject::Use().

◆ SendLootError()

void Player::SendLootError ( ObjectGuid  guid,
LootError  error 
)

◆ SendLootRelease()

void Player::SendLootRelease ( ObjectGuid  guid)
7723{
7725 data << guid << uint8(1);
7726 SendDirectMessage(&data);
7727}
@ SMSG_LOOT_RELEASE_RESPONSE
Definition: Opcodes.h:383

References SendDirectMessage(), and SMSG_LOOT_RELEASE_RESPONSE.

Referenced by WorldSession::DoLootRelease(), WorldSession::HandleAutostoreLootItemOpcode(), SendLoot(), and StoreLootItem().

◆ SendMailResult()

void Player::SendMailResult ( uint32  mailId,
MailResponseType  mailAction,
MailResponseResult  mailError,
uint32  equipError = 0,
ObjectGuid::LowType  item_guid = 0,
uint32  item_count = 0 
)
2853{
2854 WorldPacket data(SMSG_SEND_MAIL_RESULT, (4 + 4 + 4 + (mailError == MAIL_ERR_EQUIP_ERROR ? 4 : (mailAction == MAIL_ITEM_TAKEN ? 4 + 4 : 0))));
2855 data << (uint32) mailId;
2856 data << (uint32) mailAction;
2857 data << (uint32) mailError;
2858 if (mailError == MAIL_ERR_EQUIP_ERROR)
2859 data << (uint32) equipError;
2860 else if (mailAction == MAIL_ITEM_TAKEN)
2861 {
2862 data << (uint32) item_guid; // item guid low?
2863 data << (uint32) item_count; // item count?
2864 }
2865 GetSession()->SendPacket(&data);
2866}
@ MAIL_ITEM_TAKEN
Definition: SharedDefines.h:3502
@ MAIL_ERR_EQUIP_ERROR
Definition: SharedDefines.h:3511
@ SMSG_SEND_MAIL_RESULT
Definition: Opcodes.h:599

References GetSession(), MAIL_ERR_EQUIP_ERROR, MAIL_ITEM_TAKEN, WorldSession::SendPacket(), and SMSG_SEND_MAIL_RESULT.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and WorldSession::HandleSendMail().

◆ SendMessageToSet() [1/2]

◆ SendMessageToSet() [2/2]

void Player::SendMessageToSet ( WorldPacket const *  data,
Player const *  skipped_rcvr 
) const
overridevirtual

Reimplemented from WorldObject.

5640{
5641 if (skipped_rcvr != this)
5642 SendDirectMessage(data);
5643
5644 Acore::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr);
5646}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:193
Definition: GridNotifiers.h:100

References WorldObject::GetVisibilityRange(), SendDirectMessage(), and Cell::VisitWorldObjects().

◆ SendMessageToSetInRange() [1/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self 
) const
overridevirtual

Reimplemented from WorldObject.

5618{
5619 if (self)
5620 SendDirectMessage(data);
5621
5622 Acore::MessageDistDeliverer notifier(this, data, dist);
5623 Cell::VisitWorldObjects(this, notifier, dist);
5624}

References SendDirectMessage(), and Cell::VisitWorldObjects().

Referenced by Say(), AchievementMgr::SendAchievementEarned(), SendMessageToSet(), TextEmote(), and Yell().

◆ SendMessageToSetInRange() [2/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self,
bool  includeMargin,
bool  ownTeamOnly,
bool  required3dDist = false 
) const
5627{
5628 if (self)
5629 SendDirectMessage(data);
5630
5631 dist += GetObjectSize();
5632 if (includeMargin)
5633 dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets
5634
5635 Acore::MessageDistDeliverer notifier(this, data, dist, ownTeamOnly, nullptr, required3dDist);
5636 Cell::VisitWorldObjects(this, notifier, dist);
5637}
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
float GetObjectSize() const
Definition: Object.cpp:2768

References WorldObject::GetObjectSize(), SendDirectMessage(), VISIBILITY_COMPENSATION, and Cell::VisitWorldObjects().

◆ SendMirrorTimer()

void Player::SendMirrorTimer ( MirrorTimerType  Type,
uint32  MaxValue,
uint32  CurrentValue,
int32  Regen 
)
protected
731{
732 if (int(MaxValue) == DISABLED_MIRROR_TIMER)
733 {
734 if (int(CurrentValue) != DISABLED_MIRROR_TIMER)
735 StopMirrorTimer(Type);
736 return;
737 }
738 SendDirectMessage(WorldPackets::Misc::StartMirrorTimer(Type, CurrentValue, MaxValue, Regen, 0, 0).Write());
739}
Definition: MiscPackets.h:121

References DISABLED_MIRROR_TIMER, SendDirectMessage(), and StopMirrorTimer().

Referenced by HandleDrowning().

◆ SendMovieStart()

void Player::SendMovieStart ( uint32  MovieId)
5665{
5667 data << uint32(MovieId);
5668 SendDirectMessage(&data);
5669}
@ SMSG_TRIGGER_MOVIE
Definition: Opcodes.h:1154

References SendDirectMessage(), and SMSG_TRIGGER_MOVIE.

Referenced by debug_commandscript::HandleDebugPlayMovieCommand().

◆ SendNewItem()

void Player::SendNewItem ( Item item,
uint32  count,
bool  received,
bool  created,
bool  broadcast = false,
bool  sendChatMessage = true 
)
4766{
4767 if (!item) // prevent crash
4768 return;
4769
4770 // last check 2.0.10
4771 WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4));
4772 data << GetGUID(); // player GUID
4773 data << uint32(received); // 0=looted, 1=from npc
4774 data << uint32(created); // 0=received, 1=created
4775 data << uint32(sendChatMessage); // bool print message to chat
4776 data << uint8(item->GetBagSlot()); // bagslot
4777 // item slot, but when added to stack: 0xFFFFFFFF
4778 data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
4779 data << uint32(item->GetEntry()); // item id
4780 data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
4781 data << int32(item->GetItemRandomPropertyId()); // random item property id
4782 data << uint32(count); // count of items
4783 data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory
4784
4785 if (broadcast && GetGroup())
4786 GetGroup()->BroadcastPacket(&data, true);
4787 else
4788 GetSession()->SendPacket(&data);
4789}
@ SMSG_ITEM_PUSH_RESULT
Definition: Opcodes.h:388
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1757

References Group::BroadcastPacket(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetItemCount(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), GetSession(), Item::GetSlot(), WorldSession::SendPacket(), and SMSG_ITEM_PUSH_RESULT.

Referenced by _StoreOrEquipNewItem(), AddItem(), AutoStoreLoot(), Spell::DoCreateItem(), GiveQuestSourceItem(), misc_commandscript::HandleAddItemCommand(), misc_commandscript::HandleAddItemSetCommand(), AuraEffect::HandleChannelDeathItem(), OPvPCapturePointNA::HandleCustomSpell(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandlePetitionBuyOpcode(), RefundItem(), RemovePet(), RewardQuest(), npc_oculus_drakegiver::StoreEssence(), and StoreLootItem().

◆ SendNewMail()

void Player::SendNewMail ( )
2869{
2870 // deliver undelivered mail
2872 data << (uint32) 0;
2873 GetSession()->SendPacket(&data);
2874}
@ SMSG_RECEIVED_MAIL
Definition: Opcodes.h:675

References GetSession(), WorldSession::SendPacket(), and SMSG_RECEIVED_MAIL.

Referenced by AddNewMailDeliverTime(), and Update().

◆ SendNotifyLootItemRemoved()

void Player::SendNotifyLootItemRemoved ( uint8  lootSlot)
8136{
8138 data << uint8(lootSlot);
8139 GetSession()->SendPacket(&data);
8140}
@ SMSG_LOOT_REMOVED
Definition: Opcodes.h:384

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_REMOVED.

Referenced by Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), and StoreLootItem().

◆ SendNotifyLootMoneyRemoved()

void Player::SendNotifyLootMoneyRemoved ( )
8130{
8132 GetSession()->SendPacket(&data);
8133}
@ SMSG_LOOT_CLEAR_MONEY
Definition: Opcodes.h:387

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_CLEAR_MONEY.

Referenced by Loot::NotifyMoneyRemoved().

◆ SendPreparedGossip()

void Player::SendPreparedGossip ( WorldObject source)
210{
211 if (!source)
212 return;
213
214 if (source->GetTypeId() == TYPEID_UNIT)
215 {
216 // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
218 {
219 SendPreparedQuest(source->GetGUID());
220 return;
221 }
222 }
223 else if (source->GetTypeId() == TYPEID_GAMEOBJECT)
224 {
225 // probably need to find a better way here
227 {
228 SendPreparedQuest(source->GetGUID());
229 return;
230 }
231 }
232
233 // in case non empty gossip menu (that not included quests list size) show it
234 // (quest entries from quest menu will be included in list)
235
236 uint32 textId = GetGossipTextId(source);
237
239 textId = GetGossipTextId(menuId, source);
240
241 PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
242}
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:294
bool Empty() const
Definition: GossipDef.h:241
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
Definition: GossipDef.cpp:193

References QuestMenu::Empty(), PlayerMenu::GetGossipMenu(), GetGossipTextId(), Object::GetGUID(), GossipMenu::GetMenuId(), PlayerMenu::GetQuestMenu(), Object::GetTypeId(), Unit::HasNpcFlag(), PlayerTalkClass, PlayerMenu::SendGossipMenu(), SendPreparedQuest(), Object::ToCreature(), TYPEID_GAMEOBJECT, TYPEID_UNIT, and UNIT_NPC_FLAG_GOSSIP.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ SendPreparedQuest()

void Player::SendPreparedQuest ( ObjectGuid  guid)
Todo:
verify if check for !quest->IsDaily() is really correct (possibly not)
116{
117 QuestMenu& questMenu = PlayerTalkClass->GetQuestMenu();
118 if (questMenu.Empty())
119 return;
120
121 // single element case
122 if (questMenu.GetMenuItemCount() == 1)
123 {
124 QuestMenuItem const& qmi0 = questMenu.GetItem(0);
125 uint32 questId = qmi0.QuestId;
126
127 // Auto open -- maybe also should verify there is no greeting
128 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
129 {
130 if (qmi0.QuestIcon == 4)
131 PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanRewardQuest(quest, false), true);
132 // Send completable on repeatable and autoCompletable quest if player don't have quest
134 else
135 {
137 if (!object || (!object->hasQuest(questId) && !object->hasInvolvedQuest(questId)))
138 {
140 return;
141 }
142
143 if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
144 AddQuestAndCheckCompletion(quest, object);
145
146 if (quest->IsAutoComplete() || !quest->GetQuestMethod())
148 else
150 }
151 }
152 }
153 // multiple entries
154 else
155 {
156 QEmote qe;
157 qe._Delay = 0;
158 qe._Emote = 0;
159 std::string title = "";
160
161 // need pet case for some quests
163 if (creature)
164 {
165 uint32 textid = GetGossipTextId(creature);
166 GossipText const* gossiptext = sObjectMgr->GetGossipText(textid);
167 if (!gossiptext)
168 {
169 qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
170 qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote
171 title = "";
172 }
173 else
174 {
175 qe = gossiptext->Options[0].Emotes[0];
176
177 if (!gossiptext->Options[0].Text_0.empty())
178 {
179 title = gossiptext->Options[0].Text_0;
180
181 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
182 if (loc_idx >= 0)
183 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
184 ObjectMgr::GetLocaleString(npcTextLocale->Text_0[0], loc_idx, title);
185 }
186 else
187 {
188 title = gossiptext->Options[0].Text_1;
189
190 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
191 if (loc_idx >= 0)
192 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
193 ObjectMgr::GetLocaleString(npcTextLocale->Text_1[0], loc_idx, title);
194 }
195 }
196 }
197
199 }
200}
@ TYPEMASK_ITEM
Definition: ObjectGuid.h:47
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
Definition: GossipDef.h:154
uint32 QuestId
Definition: GossipDef.h:155
uint8 QuestIcon
Definition: GossipDef.h:156
QuestMenuItem const & GetItem(uint16 index) const
Definition: GossipDef.h:248
uint8 GetMenuItemCount() const
Definition: GossipDef.h:236
void SendQuestGiverQuestList(QEmote const &eEmote, std::string const &Title, ObjectGuid guid)
Definition: GossipDef.cpp:315
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
Definition: GossipDef.cpp:388
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
Definition: GossipDef.cpp:752
Definition: Object.h:100
virtual bool hasQuest(uint32) const
Definition: Object.h:186
virtual bool hasInvolvedQuest(uint32) const
Definition: Object.h:187
bool CanAddQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:264
void AddQuestAndCheckCompletion(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:420
bool CanCompleteRepeatableQuest(Quest const *quest)
Definition: PlayerQuest.cpp:365
Definition: NPCHandler.h:25
uint32 _Emote
Definition: NPCHandler.h:26
uint32 _Delay
Definition: NPCHandler.h:27
std::string Text_0
Definition: NPCHandler.h:34
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]
Definition: NPCHandler.h:39
std::string Text_1
Definition: NPCHandler.h:35
Definition: NPCHandler.h:45
GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]
Definition: NPCHandler.h:46
Definition: NPCHandler.h:55

References QEmote::_Delay, QEmote::_Emote, AddQuestAndCheckCompletion(), CanAddQuest(), CanCompleteRepeatableQuest(), CanRewardQuest(), CanTakeQuest(), GossipTextOption::Emotes, QuestMenu::Empty(), ObjectAccessor::GetCreatureOrPetOrVehicle(), GetGossipTextId(), QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), QuestMenu::GetMenuItemCount(), ObjectAccessor::GetObjectByTypeMask(), PlayerMenu::GetQuestMenu(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Object::hasInvolvedQuest(), Object::hasQuest(), GossipText::Options, PlayerTalkClass, QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, PlayerMenu::SendCloseGossip(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestGiverQuestList(), PlayerMenu::SendQuestGiverRequestItems(), sObjectMgr, GossipTextOption::Text_0, GossipTextOption::Text_1, TYPEMASK_GAMEOBJECT, TYPEMASK_ITEM, and TYPEMASK_UNIT.

Referenced by npc_cos_chromie_middle::OnGossipHello(), OnGossipSelect(), SendPreparedGossip(), npc_costumed_orphan_matron::sGossipHello(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ SendProficiency()

void Player::SendProficiency ( ItemClass  itemClass,
uint32  itemSubclassMask 
)
10058{
10059 WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
10060 data << uint8(itemClass) << uint32(itemSubclassMask);
10061 GetSession()->SendPacket(&data);
10062}
@ SMSG_SET_PROFICIENCY
Definition: Opcodes.h:325

References GetSession(), WorldSession::SendPacket(), and SMSG_SET_PROFICIENCY.

Referenced by Spell::EffectProficiency().

◆ SendPushToPartyResponse()

void Player::SendPushToPartyResponse ( Player const *  player,
uint8  msg 
) const
2430{
2431 if (player)
2432 {
2433 WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1));
2434 data << player->GetGUID();
2435 data << uint8(msg); // valid values: 0-8
2436 GetSession()->SendPacket(&data);
2437 LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
2438 }
2439}
@ MSG_QUEST_PUSH_RESULT
Definition: Opcodes.h:660

References Object::GetGUID(), GetSession(), LOG_DEBUG, MSG_QUEST_PUSH_RESULT, and WorldSession::SendPacket().

Referenced by CanShareQuest(), debug_commandscript::HandleDebugSendQuestPartyMsgCommand(), WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestComplete()

void Player::SendQuestComplete ( uint32  quest_id)
2341{
2342 if (quest_id)
2343 {
2345 data << uint32(quest_id);
2346 GetSession()->SendPacket(&data);
2347 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id);
2348 }
2349}
@ SMSG_QUESTUPDATE_COMPLETE
Definition: Opcodes.h:438

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_COMPLETE.

Referenced by AreaExploredOrEventHappens().

◆ SendQuestConfirmAccept()

void Player::SendQuestConfirmAccept ( Quest const *  quest,
Player pReceiver 
)
2408{
2409 if (pReceiver)
2410 {
2411 //load locale from db
2412 std::string strTitle = quest->GetTitle();
2413
2414 int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
2415 if (loc_idx >= 0)
2416 if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
2417 ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle);
2418
2419 WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + quest->GetTitle().size() + 8));
2420 data << uint32(quest->GetQuestId());
2421 data << quest->GetTitle();
2422 data << GetGUID();
2423 pReceiver->GetSession()->SendPacket(&data);
2424
2425 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
2426 }
2427}
@ SMSG_QUEST_CONFIRM_ACCEPT
Definition: Opcodes.h:442

References Object::GetGUID(), ObjectMgr::GetLocaleString(), Quest::GetQuestId(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LOG_DEBUG, WorldSession::SendPacket(), SMSG_QUEST_CONFIRM_ACCEPT, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestFailed()

void Player::SendQuestFailed ( uint32  questId,
InventoryResult  reason = EQUIP_ERR_OK 
)
2377{
2378 if (questId)
2379 {
2381 data << uint32(questId);
2382 data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message)
2383 GetSession()->SendPacket(&data);
2384 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
2385 }
2386}
@ SMSG_QUESTGIVER_QUEST_FAILED
Definition: Opcodes.h:432

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTGIVER_QUEST_FAILED.

Referenced by FailQuest().

◆ SendQuestGiverStatusMultiple()

void Player::SendQuestGiverStatusMultiple ( )
protected
7645{
7646 uint32 count = 0;
7647
7649 data << uint32(count); // placeholder
7650
7651 for (GuidUnorderedSet::const_iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
7652 {
7653 uint32 questStatus = DIALOG_STATUS_NONE;
7654
7655 if ((*itr).IsAnyTypeCreature())
7656 {
7657 // need also pet quests case support
7658 Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr);
7659 if (!questgiver || questgiver->IsHostileTo(this))
7660 continue;
7661 if (!questgiver->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))
7662 continue;
7663
7664 questStatus = GetQuestDialogStatus(questgiver);
7665
7666 data << questgiver->GetGUID();
7667 data << uint8(questStatus);
7668 ++count;
7669 }
7670 else if ((*itr).IsGameObject())
7671 {
7672 GameObject* questgiver = GetMap()->GetGameObject(*itr);
7673 if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
7674 continue;
7675
7676 questStatus = GetQuestDialogStatus(questgiver);
7677
7678 data << questgiver->GetGUID();
7679 data << uint8(questStatus);
7680 ++count;
7681 }
7682 }
7683
7684 data.put<uint32>(0, count); // write real count
7685 GetSession()->SendPacket(&data);
7686}
@ SMSG_QUESTGIVER_STATUS_MULTIPLE
Definition: Opcodes.h:1078
QuestGiverStatus GetQuestDialogStatus(Object *questGiver)
Definition: PlayerQuest.cpp:1589

References DIALOG_STATUS_NONE, GAMEOBJECT_TYPE_QUESTGIVER, ObjectAccessor::GetCreatureOrPetOrVehicle(), Map::GetGameObject(), GameObject::GetGoType(), Object::GetGUID(), WorldObject::GetMap(), GetQuestDialogStatus(), GetSession(), Unit::HasNpcFlag(), Unit::IsHostileTo(), m_clientGUIDs, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_QUESTGIVER_STATUS_MULTIPLE, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by GiveLevel(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleQuestgiverStatusMultipleQuery(), RewardQuest(), and SendInitialPacketsAfterAddToMap().

◆ SendQuestReward()

void Player::SendQuestReward ( Quest const *  quest,
uint32  XP 
)
2352{
2353 uint32 questid = quest->GetQuestId();
2354 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = {}", questid);
2355 sGameEventMgr->HandleQuestComplete(questid);
2356 WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
2357 data << uint32(questid);
2358
2359 if (!IsMaxLevel())
2360 {
2361 data << uint32(XP);
2362 data << uint32(quest->GetRewOrReqMoney(GetLevel()));
2363 }
2364 else
2365 {
2366 data << uint32(0);
2367 data << uint32(quest->GetRewOrReqMoney(GetLevel()) + quest->GetRewMoneyMaxLevel());
2368 }
2369
2370 data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
2371 data << uint32(quest->GetBonusTalents()); // bonus talents
2372 data << uint32(quest->GetRewArenaPoints());
2373 GetSession()->SendPacket(&data);
2374}
@ SMSG_QUESTGIVER_QUEST_COMPLETE
Definition: Opcodes.h:431
bool IsMaxLevel() const
Definition: Player.cpp:2547

References Quest::CalculateHonorGain(), Quest::GetBonusTalents(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), Quest::GetRewArenaPoints(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), GetSession(), IsMaxLevel(), LOG_DEBUG, WorldSession::SendPacket(), sGameEventMgr, and SMSG_QUESTGIVER_QUEST_COMPLETE.

Referenced by RewardQuest().

◆ SendQuestTimerFailed()

void Player::SendQuestTimerFailed ( uint32  quest_id)
2389{
2390 if (quest_id)
2391 {
2393 data << uint32(quest_id);
2394 GetSession()->SendPacket(&data);
2395 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
2396 }
2397}
@ SMSG_QUESTUPDATE_FAILEDTIMER
Definition: Opcodes.h:437

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_FAILEDTIMER.

Referenced by FailQuest().

◆ SendQuestUpdate()

void Player::SendQuestUpdate ( uint32  questId)
1521{
1522 uint32 zone = 0, area = 0;
1523 // xinef: fixup
1524 uint32 oldSpellId = 0;
1525
1526 SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
1527 if (saBounds.first != saBounds.second)
1528 {
1529 GetZoneAndAreaId(zone, area);
1530
1531 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1532 {
1533 // xinef: spell was already casted, skip different areas with same spell
1534 if (itr->second->spellId == oldSpellId)
1535 continue;
1536 if (itr->second->autocast && itr->second->IsFitToRequirements(this, zone, area))
1537 if (!HasAura(itr->second->spellId))
1538 {
1539 CastSpell(this, itr->second->spellId, true);
1540 oldSpellId = itr->second->spellId;
1541 }
1542 }
1543 }
1544
1545 saBounds = sSpellMgr->GetSpellAreaForQuestEndMapBounds(questId);
1546
1547 // xinef: fixup
1548 uint32 skipSpellId = 0;
1549 oldSpellId = 0;
1550 if (saBounds.first != saBounds.second)
1551 {
1552 if (!zone || !area)
1553 GetZoneAndAreaId(zone, area);
1554
1555 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1556 {
1557 // xinef: skip spell for which condition is already fulfilled
1558 if (itr->second->spellId == skipSpellId)
1559 continue;
1560 skipSpellId = 0;
1561
1562 // xinef: spells are sorted, if no condition is fulfilled remove aura
1563 if (oldSpellId && oldSpellId != itr->second->spellId)
1564 {
1565 RemoveAurasDueToSpell(oldSpellId);
1566 oldSpellId = 0;
1567 }
1568
1569 if (!itr->second->IsFitToRequirements(this, zone, area))
1570 {
1571 //RemoveAurasDueToSpell(itr->second->spellId);
1572 oldSpellId = itr->second->spellId;
1573 }
1574 else
1575 {
1576 skipSpellId = itr->second->spellId;
1577 oldSpellId = 0;
1578 }
1579 }
1580
1581 // xinef: check if we have something to remove yet
1582 if (oldSpellId)
1583 RemoveAurasDueToSpell(oldSpellId);
1584 }
1585
1587}
std::pair< SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator > SpellAreaForQuestMapBounds
Definition: SpellMgr.h:548

References Unit::CastSpell(), WorldObject::GetZoneAndAreaId(), Unit::HasAura(), Unit::RemoveAurasDueToSpell(), sSpellMgr, and UpdateForQuestWorldObjects().

Referenced by AddQuest(), RemoveActiveQuest(), RemoveRewardedQuest(), RewardQuest(), and SetQuestStatus().

◆ SendQuestUpdateAddCreatureOrGo()

void Player::SendQuestUpdateAddCreatureOrGo ( Quest const *  quest,
ObjectGuid  guid,
uint32  creatureOrGO_idx,
uint16  old_count,
uint16  add_count 
)
2451{
2452 ASSERT(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)");
2453
2454 int32 entry = quest->RequiredNpcOrGo[ creatureOrGO_idx ];
2455 if (entry < 0)
2456 // client expected gameobject template id in form (id|0x80000000)
2457 entry = (-entry) | 0x80000000;
2458
2459 WorldPacket data(SMSG_QUESTUPDATE_ADD_KILL, (4 * 4 + 8));
2460 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_KILL");
2461 data << uint32(quest->GetQuestId());
2462 data << uint32(entry);
2463 data << uint32(old_count + add_count);
2464 data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]);
2465 data << guid;
2466 GetSession()->SendPacket(&data);
2467
2468 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2469 if (log_slot < MAX_QUEST_LOG_SIZE)
2470 SetQuestSlotCounter(log_slot, creatureOrGO_idx, GetQuestSlotCounter(log_slot, creatureOrGO_idx) + add_count);
2471}
@ SMSG_QUESTUPDATE_ADD_KILL
Definition: Opcodes.h:439
uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const
Definition: Player.h:1475

References ASSERT, FindQuestSlot(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_KILL.

Referenced by KillCreditGO(), KilledMonsterCredit(), and TalkedToCreature().

◆ SendQuestUpdateAddItem()

void Player::SendQuestUpdateAddItem ( Quest const *  quest,
uint32  item_idx,
uint16  count 
)
2442{
2444 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM");
2445 //data << quest->RequiredItemId[item_idx];
2446 //data << count;
2447 GetSession()->SendPacket(&data);
2448}
@ SMSG_QUESTUPDATE_ADD_ITEM
Definition: Opcodes.h:440

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_ADD_ITEM.

◆ SendQuestUpdateAddPlayer()

void Player::SendQuestUpdateAddPlayer ( Quest const *  quest,
uint16  old_count,
uint16  add_count 
)
2474{
2475 ASSERT(old_count + add_count < 65536 && "player count store in 16 bits");
2476
2478 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
2479 data << uint32(quest->GetQuestId());
2480 data << uint32(old_count + add_count);
2481 data << uint32(quest->GetPlayersSlain());
2482 GetSession()->SendPacket(&data);
2483
2484 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2485 if (log_slot < MAX_QUEST_LOG_SIZE)
2487}
@ SMSG_QUESTUPDATE_ADD_PVP_KILL
Definition: Opcodes.h:1165

References ASSERT, FindQuestSlot(), Quest::GetPlayersSlain(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, QUEST_PVP_KILL_SLOT, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_PVP_KILL.

Referenced by KilledPlayerCreditForQuest().

◆ SendRaidDifficulty()

void Player::SendRaidDifficulty ( bool  IsInGroup,
int32  forcedDifficulty = -1 
)
178{
179 uint8 val = 0x00000001;
181 data << uint32(forcedDifficulty == -1 ? GetRaidDifficulty() : forcedDifficulty);
182 data << uint32(val);
183 data << uint32(IsInGroup);
184 GetSession()->SendPacket(&data);
185}
@ MSG_SET_RAID_DIFFICULTY
Definition: Opcodes.h:1289

References GetRaidDifficulty(), GetSession(), MSG_SET_RAID_DIFFICULTY, and WorldSession::SendPacket().

Referenced by Group::AddMember(), WorldSession::HandleSetRaidDifficultyOpcode(), SendInitialPacketsAfterAddToMap(), and Group::SetRaidDifficulty().

◆ SendRaidInfo()

void Player::SendRaidInfo ( )
6535{
6536 uint32 counter = 0;
6537
6539
6540 std::size_t p_counter = data.wpos();
6541 data << uint32(counter); // placeholder
6542
6543 time_t now = GameTime::GetGameTime().count();
6544
6545 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6546 {
6547 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6548 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6549 {
6550 if (itr->second.perm)
6551 {
6552 InstanceSave* save = itr->second.save;
6553 time_t resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
6554 data << uint32(save->GetMapId()); // map id
6555 data << uint32(save->GetDifficulty()); // difficulty
6556 data << ObjectGuid::Create<HighGuid::Instance>(save->GetInstanceId()); // instance id
6557 data << uint8(1); // expired = 0
6558 data << uint8(itr->second.extended ? 1 : 0);// extended = 1
6559 data << uint32(resetTime >= now ? resetTime - now : 0); // reset time
6560 ++counter;
6561 }
6562 }
6563 }
6564 data.put<uint32>(p_counter, counter);
6565 GetSession()->SendPacket(&data);
6566}
@ SMSG_RAID_INSTANCE_INFO
Definition: Opcodes.h:746
Difficulty GetDifficulty() const
Definition: InstanceSaveMgr.h:63

References InstanceSave::GetDifficulty(), InstanceSave::GetExtendedResetTime(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), InstanceSave::GetResetTime(), GetSession(), MAX_DIFFICULTY, ByteBuffer::put(), WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_RAID_INSTANCE_INFO, and ByteBuffer::wpos().

Referenced by WorldSession::HandleRequestRaidInfoOpcode().

◆ SendRefundInfo()

void Player::SendRefundInfo ( Item item)
private
15470{
15471 // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
15472 item->UpdatePlayedTime(this);
15473
15474 if (!item->IsRefundable())
15475 {
15476 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15477 return;
15478 }
15479
15480 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15481 {
15482 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15483 item->SetNotRefundable(this);
15484 return;
15485 }
15486
15487 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15488 if (!iece)
15489 {
15490 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15491 return;
15492 }
15493
15494 WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4);
15495 data << item->GetGUID(); // item guid
15496 data << uint32(item->GetPaidMoney()); // money cost
15497 data << uint32(iece->reqhonorpoints); // honor point cost
15498 data << uint32(iece->reqarenapoints); // arena point cost
15499 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15500 {
15501 data << uint32(iece->reqitem[i]);
15502 data << uint32(iece->reqitemcount[i]);
15503 }
15504 data << uint32(0);
15505 data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
15506 GetSession()->SendPacket(&data);
15507}
@ SMSG_ITEM_REFUND_INFO_RESPONSE
Definition: Opcodes.h:1232
uint32 GetTotalPlayedTime()
Definition: Player.h:1185

References Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetPlayedTime(), Item::GetRefundRecipient(), GetSession(), GetTotalPlayedTime(), Item::IsRefundable(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_INFO_RESPONSE, and Item::UpdatePlayedTime().

Referenced by WorldSession::HandleItemRefundInfoRequest(), and SwapItem().

◆ SendRemoveControlBar()

void Player::SendRemoveControlBar ( )
9654{
9656 data << uint64(0);
9657 GetSession()->SendPacket(&data);
9658}

References GetSession(), WorldSession::SendPacket(), and SMSG_PET_SPELLS.

Referenced by Unit::RemoveCharmedBy(), and Unit::SetMinion().

◆ SendResetFailedNotify()

void Player::SendResetFailedNotify ( uint32  mapid)
188{
190 data << uint32(mapid);
191 GetSession()->SendPacket(&data);
192}
@ SMSG_RESET_FAILED_NOTIFY
Definition: Opcodes.h:948

References GetSession(), WorldSession::SendPacket(), and SMSG_RESET_FAILED_NOTIFY.

◆ SendResetInstanceFailed()

void Player::SendResetInstanceFailed ( uint32  reason,
uint32  MapId 
)
334{
335 /*reasons for instance reset failure:
336 // 0: There are players inside the instance.
337 // 1: There are players offline in your party.
338 // 2>: There are players in your party attempting to zone into an instance.
339 */
341 data << uint32(reason);
342 data << uint32(MapId);
343 GetSession()->SendPacket(&data);
344}
@ SMSG_INSTANCE_RESET_FAILED
Definition: Opcodes.h:829

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET_FAILED.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendResetInstanceSuccess()

void Player::SendResetInstanceSuccess ( uint32  MapId)
327{
329 data << uint32(MapId);
330 GetSession()->SendPacket(&data);
331}
@ SMSG_INSTANCE_RESET
Definition: Opcodes.h:828

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendRespondInspectAchievements()

void Player::SendRespondInspectAchievements ( Player player) const
13859{
13861}
void SendRespondInspectAchievements(Player *player) const
Definition: AchievementMgr.cpp:2346

References m_achievementMgr, and AchievementMgr::SendRespondInspectAchievements().

Referenced by WorldSession::HandleQueryInspectAchievements().

◆ SendSavedInstances()

void Player::SendSavedInstances ( )
6572{
6573 bool hasBeenSaved = false;
6574 WorldPacket data;
6575
6576 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6577 {
6578 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6579 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6580 {
6581 if (itr->second.perm) // only permanent binds are sent
6582 {
6583 hasBeenSaved = true;
6584 break;
6585 }
6586 }
6587 }
6588
6589 //Send opcode 811. true or false means, whether you have current raid/heroic instances
6591 data << uint32(hasBeenSaved);
6592 GetSession()->SendPacket(&data);
6593
6594 if (!hasBeenSaved)
6595 return;
6596
6597 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6598 {
6599 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6600 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6601 {
6602 if (itr->second.perm)
6603 {
6605 data << uint32(itr->second.save->GetMapId());
6606 GetSession()->SendPacket(&data);
6607 }
6608 }
6609 }
6610}
@ SMSG_UPDATE_INSTANCE_OWNERSHIP
Definition: Opcodes.h:841
@ SMSG_UPDATE_LAST_INSTANCE
Definition: Opcodes.h:830
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:69

References Object::GetGUID(), GetSession(), WorldPacket::Initialize(), MAX_DIFFICULTY, WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_UPDATE_INSTANCE_OWNERSHIP, and SMSG_UPDATE_LAST_INSTANCE.

Referenced by TeleportTo().

◆ SendSellError()

void Player::SendSellError ( SellResult  msg,
Creature creature,
ObjectGuid  guid,
uint32  param 
)
4092{
4093 LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM");
4094 WorldPacket data(SMSG_SELL_ITEM, (8 + 8 + (param ? 4 : 0) + 1)); // last check 2.0.10
4095 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4096 data << guid;
4097 if (param > 0)
4098 data << uint32(param);
4099 data << uint8(msg);
4100 GetSession()->SendPacket(&data);
4101}
@ SMSG_SELL_ITEM
Definition: Opcodes.h:447

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_SELL_ITEM.

Referenced by WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendSellErrorCommand(), WorldSession::HandleSellItemOpcode(), and WorldSession::SendListInventory().

◆ SendSystemMessage()

void Player::SendSystemMessage ( std::string_view  msg,
bool  escapeCharacters = false 
)
16308{
16309 ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
16310}

References GetSession(), and ChatHandler::SendSysMessage().

◆ SendTalentsInfoData()

◆ SendTalentWipeConfirm()

void Player::SendTalentWipeConfirm ( ObjectGuid  guid)
8835{
8836 WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8 + 4));
8837 data << guid;
8838 uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost();
8839 data << cost;
8840 GetSession()->SendPacket(&data);
8841}
@ MSG_TALENT_WIPE_CONFIRM
Definition: Opcodes.h:712

References CONFIG_NO_RESET_TALENT_COST, GetSession(), MSG_TALENT_WIPE_CONFIRM, resetTalentsCost(), WorldSession::SendPacket(), and sWorld.

Referenced by Spell::EffectUntrainTalents(), and OnGossipSelect().

◆ SendTaxiNodeStatusMultiple()

void Player::SendTaxiNodeStatusMultiple ( )
10460{
10461 for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
10462 {
10463 if (!itr->IsCreature())
10464 {
10465 continue;
10466 }
10467
10468 Creature* creature = ObjectAccessor::GetCreature(*this, *itr);
10469 if (!creature || creature->IsHostileTo(this))
10470 {
10471 continue;
10472 }
10473
10474 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER))
10475 {
10476 continue;
10477 }
10478
10479 uint32 nearestNode = sObjectMgr->GetNearestTaxiNode(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetMapId(), GetTeamId());
10480 if (!nearestNode)
10481 {
10482 continue;
10483 }
10484
10486 data << *itr;
10487 data << uint8(m_taxi.IsTaximaskNodeKnown(nearestNode) ? 1 : 0);
10488 SendDirectMessage(&data);
10489 }
10490}
@ SMSG_TAXINODE_STATUS
Definition: Opcodes.h:457
bool IsTaximaskNodeKnown(uint32 nodeidx) const
Definition: PlayerTaxi.h:35

References ObjectAccessor::GetCreature(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTeamId(), Unit::HasNpcFlag(), Unit::IsHostileTo(), PlayerTaxi::IsTaximaskNodeKnown(), m_clientGUIDs, m_taxi, SendDirectMessage(), SMSG_TAXINODE_STATUS, sObjectMgr, and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendTeleportAckPacket()

void Player::SendTeleportAckPacket ( )
1321{
1323 data << GetPackGUID();
1324 data << uint32(0); // this value increments every time
1325 BuildMovementPacket(&data);
1326 GetSession()->SendPacket(&data);
1327}
@ MSG_MOVE_TELEPORT_ACK
Definition: Opcodes.h:229
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19819

References Unit::BuildMovementPacket(), Object::GetPackGUID(), GetSession(), MSG_MOVE_TELEPORT_ACK, and WorldSession::SendPacket().

Referenced by TeleportTo().

◆ SendTransferAborted()

void Player::SendTransferAborted ( uint32  mapid,
TransferAbortReason  reason,
uint8  arg = 0 
)
11670{
11672 data << uint32(mapid);
11673 data << uint8(reason); // transfer abort reason
11674 switch (reason)
11675 {
11679 // these are the ONLY cases that have an extra argument in the packet!!!
11680 data << uint8(arg);
11681 break;
11682 default:
11683 break;
11684 }
11685 GetSession()->SendPacket(&data);
11686}
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition: Player.h:791
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition: Player.h:789
@ SMSG_TRANSFER_ABORTED
Definition: Opcodes.h:94

References GetSession(), WorldSession::SendPacket(), SMSG_TRANSFER_ABORTED, TRANSFER_ABORT_DIFFICULTY, TRANSFER_ABORT_INSUF_EXPAN_LVL, and TRANSFER_ABORT_UNIQUE_MESSAGE.

Referenced by InstanceMap::CannotEnter(), MapMgr::PlayerCannotEnter(), Satisfy(), and TeleportTo().

◆ SendUpdateToOutOfRangeGroupMembers()

void Player::SendUpdateToOutOfRangeGroupMembers ( )
11657{
11659 return;
11660 if (Group* group = GetGroup())
11661 group->UpdatePlayerOutOfRange(this);
11662
11665 if (Pet* pet = GetPet())
11666 pet->ResetAuraUpdateMaskForRaid();
11667}
@ GROUP_UPDATE_FLAG_NONE
Definition: Group.h:99

References GetGroup(), GetPet(), GROUP_UPDATE_FLAG_NONE, m_auraRaidUpdateMask, and m_groupUpdateMask.

Referenced by Update().

◆ SendUpdateWorldState()

void Player::SendUpdateWorldState ( uint32  variable,
uint32  value 
) const
2194{
2196 worldstate.VariableID = variable;
2197 worldstate.Value = value;
2198 SendDirectMessage(worldstate.Write());
2199}
Definition: WorldStatePackets.h:50
int32 Value
Definition: WorldStatePackets.h:57
WorldPacket const * Write() override
Definition: WorldStatePackets.cpp:40
int32 VariableID
Definition: WorldStatePackets.h:56

References SendDirectMessage(), WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by debug_commandscript::HandleDebugUpdateWorldStateCommand(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), OPvPCapturePointEP_EWT::HandlePlayerEnter(), OPvPCapturePointEP_NPT::HandlePlayerEnter(), OPvPCapturePointEP_CGT::HandlePlayerEnter(), OPvPCapturePointEP_PWT::HandlePlayerEnter(), OPvPCapturePointGH::HandlePlayerEnter(), OPvPCapturePointHP::HandlePlayerEnter(), OPvPCapturePointNA::HandlePlayerEnter(), OPvPCapturePointTF::HandlePlayerEnter(), OPvPCapturePointZM_Beacon::HandlePlayerEnter(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), OPvPCapturePointEP_EWT::HandlePlayerLeave(), OPvPCapturePointEP_NPT::HandlePlayerLeave(), OPvPCapturePointEP_CGT::HandlePlayerLeave(), OPvPCapturePointEP_PWT::HandlePlayerLeave(), OPvPCapturePointGH::HandlePlayerLeave(), OPvPCapturePointHP::HandlePlayerLeave(), OPvPCapturePointNA::HandlePlayerLeave(), OPvPCapturePointTF::HandlePlayerLeave(), OPvPCapturePointZM_Beacon::HandlePlayerLeave(), npc_wg_queue::OnGossipHello(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnPlayerEnter(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::OnPlayerEnter(), instance_oculus::instance_oculus_InstanceMapScript::OnPlayerEnter(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), OutdoorPvPEP::SendRemoveWorldStates(), OutdoorPvPGH::SendRemoveWorldStates(), OutdoorPvPHP::SendRemoveWorldStates(), OutdoorPvPNA::SendRemoveWorldStates(), OutdoorPvPSI::SendRemoveWorldStates(), OutdoorPvPTF::SendRemoveWorldStates(), OutdoorPvPZM::SendRemoveWorldStates(), and GameEventMgr::SendWorldStateUpdate().

◆ SetAcceptWhispers()

void Player::SetAcceptWhispers ( bool  on)
inline

◆ SetActiveSpec()

void Player::SetActiveSpec ( uint8  spec)
inline
1722{ m_activeSpec = spec; }

References m_activeSpec.

Referenced by ActivateSpec().

◆ SetAmmo()

void Player::SetAmmo ( uint32  item)
2508{
2509 if (!item)
2510 return;
2511
2512 // already set
2513 if (GetUInt32Value(PLAYER_AMMO_ID) == item)
2514 return;
2515
2516 // check ammo
2517 InventoryResult msg = CanUseAmmo(item);
2518 if (msg != EQUIP_ERR_OK)
2519 {
2520 SendEquipError(msg, nullptr, nullptr, item);
2521 return;
2522 }
2523
2525
2527}

References _ApplyAmmoBonuses(), CanUseAmmo(), EQUIP_ERR_OK, Object::GetUInt32Value(), PLAYER_AMMO_ID, SendEquipError(), and Unit::SetUInt32Value().

Referenced by Create(), and WorldSession::HandleSetAmmoOpcode().

◆ SetArenaPoints()

void Player::SetArenaPoints ( uint32  value)
6219{
6220 if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
6221 value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS);
6223 if (value)
6225}
@ ITEM_ARENA_POINTS_ID
Definition: Player.h:960
@ CONFIG_MAX_ARENA_POINTS
Definition: IWorld.h:249

References AddKnownCurrency(), CONFIG_MAX_ARENA_POINTS, ITEM_ARENA_POINTS_ID, PLAYER_FIELD_ARENA_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), LoadFromDB(), and ModifyArenaPoints().

◆ SetArenaTeamIdInvited()

void Player::SetArenaTeamIdInvited ( uint32  ArenaTeamId)
inline

◆ SetArenaTeamInfoField()

◆ SetAtLoginFlag()

void Player::SetAtLoginFlag ( AtLoginFlags  f)
inline

◆ SetAuraUpdateMaskForRaid()

void Player::SetAuraUpdateMaskForRaid ( uint8  slot)
inline
2452{ m_auraRaidUpdateMask |= (uint64(1) << slot); }

References m_auraRaidUpdateMask.

◆ SetBankBagSlotCount()

void Player::SetBankBagSlotCount ( uint8  count)
inline

◆ SetBaseModValue()

void Player::SetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  value 
)
inline
2168{ m_auraBaseMod[modGroup][modType] = value; }

References m_auraBaseMod.

Referenced by UpdateAllCritPercentages().

◆ SetBaseRune()

void Player::SetBaseRune ( uint8  index,
RuneType  baseRune 
)
inline
2490{ m_runes->runes[index].BaseRune = baseRune; }

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by InitRunes().

◆ SetBattlegroundId()

◆ SetBattlegroundOrBattlefieldRaid()

void Player::SetBattlegroundOrBattlefieldRaid ( Group group,
int8  subgroup = -1 
)
13032{
13033 //we must move references from m_group to m_originalGroup
13034 if (GetGroup() && (GetGroup()->isBGGroup() || GetGroup()->isBFGroup()))
13035 {
13036 LOG_INFO("misc", "Player::SetBattlegroundOrBattlefieldRaid - current group is {} group!", (GetGroup()->isBGGroup() ? "BG" : "BF"));
13037 //ABORT(); // pussywizard: origanal group can never be bf/bg group
13038 }
13039
13041
13042 m_group.unlink();
13043 m_group.link(group, this);
13044 m_group.setSubGroup((uint8)subgroup);
13045}
uint8 GetSubGroup() const
Definition: Player.h:2448

References GetGroup(), GetSubGroup(), Reference< TO, FROM >::link(), LOG_INFO, m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), and Battleground::AddOrSetPlayerToCorrectBgGroup().

◆ SetBGData()

void Player::SetBGData ( BGData bgdata)
inline
2236{ m_bgData = bgdata; }

References m_bgData.

◆ SetBindPoint()

void Player::SetBindPoint ( ObjectGuid  guid)
8828{
8830 data << guid;
8831 GetSession()->SendPacket(&data);
8832}
@ SMSG_BINDER_CONFIRM
Definition: Opcodes.h:777

References GetSession(), WorldSession::SendPacket(), and SMSG_BINDER_CONFIRM.

Referenced by npc_innkeeper::OnGossipSelect(), and OnGossipSelect().

◆ SetCanBlock()

void Player::SetCanBlock ( bool  value)
13082{
13083 if (m_canBlock == value)
13084 return;
13085
13086 m_canBlock = value;
13088}
void UpdateBlockPercentage()
Definition: StatSystem.cpp:616

References m_canBlock, and UpdateBlockPercentage().

Referenced by Spell::EffectBlock().

◆ SetCanFly()

bool Player::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

movement counter

Reimplemented from Unit.

15870{
15871 sScriptMgr->AnticheatSetCanFlybyServer(this, apply);
15872
15873 if (!packetOnly && !Unit::SetCanFly(apply))
15874 return false;
15875
15876 if (!apply)
15878
15880 data << GetPackGUID();
15881 data << uint32(0);
15882 SendDirectMessage(&data);
15883
15884 data.Initialize(MSG_MOVE_UPDATE_CAN_FLY, 64);
15885 data << GetPackGUID();
15886 BuildMovementPacket(&data);
15887 SendMessageToSet(&data, false);
15888 return true;
15889}
@ MSG_MOVE_UPDATE_CAN_FLY
Definition: Opcodes.h:971
@ SMSG_MOVE_SET_CAN_FLY
Definition: Opcodes.h:865
@ SMSG_MOVE_UNSET_CAN_FLY
Definition: Opcodes.h:866
virtual bool SetCanFly(bool enable, bool packetOnly=false)
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition: Unit.cpp:20510

References Unit::BuildMovementPacket(), GameTime::GetGameTime(), Object::GetPackGUID(), Position::GetPositionZ(), WorldPacket::Initialize(), MSG_MOVE_UPDATE_CAN_FLY, SendDirectMessage(), SendMessageToSet(), Unit::SetCanFly(), SetFallInformation(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, and sScriptMgr.

Referenced by Unit::KnockbackFrom().

◆ SetCanKnockback()

void Player::SetCanKnockback ( bool  value)
inline
2476{ m_canKnockback = value; }

References m_canKnockback.

Referenced by Unit::KnockbackFrom().

◆ SetCanParry()

void Player::SetCanParry ( bool  value)
13073{
13074 if (m_canParry == value)
13075 return;
13076
13077 m_canParry = value;
13079}
void UpdateParryPercentage()
Definition: StatSystem.cpp:735

References m_canParry, and UpdateParryPercentage().

Referenced by Spell::EffectParry(), and AuraEffect::HandleAuraModParryPercent().

◆ SetCanTeleport()

◆ SetCanTitanGrip()

void Player::SetCanTitanGrip ( bool  value)
13091{
13092 m_canTitanGrip = value;
13093}

References m_canTitanGrip.

Referenced by ActivateSpec(), Spell::EffectTitanGrip(), and resetTalents().

◆ SetChampioningFaction()

void Player::SetChampioningFaction ( uint32  faction)
inline
2527{ m_ChampioningFaction = faction; }

References m_ChampioningFaction.

Referenced by AuraEffect::HandleAuraDummy().

◆ setCinematic()

void Player::setCinematic ( uint8  cine)
inline
1812 {
1813 m_cinematic = cine;
1814 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ SetClientControl()

void Player::SetClientControl ( Unit target,
bool  allowMove,
bool  packetOnly = false 
)
12803{
12805 data << target->GetPackGUID();
12806 data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0);
12807 GetSession()->SendPacket(&data);
12808
12809 // We want to set the packet only
12810 if (packetOnly)
12811 return;
12812
12813 if (this != target)
12814 SetViewpoint(target, allowMove);
12815
12816 if (allowMove)
12817 SetMover(target);
12818
12819 // Xinef: disable moving if target has disable move flag
12820 if (target->GetTypeId() != TYPEID_UNIT)
12821 return;
12822
12823 if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
12824 {
12826 target->SetControlled(true, UNIT_STATE_ROOT);
12827 }
12828 else if (!allowMove && target->HasUnitState(UNIT_STATE_ROOT) && !target->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
12829 {
12831 {
12832 // Xinef: restore original orientation, important for shooting vehicles!
12834 target->SetOrientation(pos.GetOrientation());
12835 target->SetFacingTo(pos.GetOrientation());
12836 target->DisableSpline();
12837 }
12838 else
12839 target->SetControlled(false, UNIT_STATE_ROOT);
12840 }
12841}
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:144
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:160
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:156
@ SMSG_CLIENT_CONTROL_UPDATE
Definition: Opcodes.h:375
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:339
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:344
bool IsMOTransport() const
Definition: ObjectGuid.h:175
void SetOrientation(float orientation)
Definition: Position.h:112
void SetFacingTo(float ori)
Definition: Unit.cpp:20430
void DisableSpline()
Definition: Unit.cpp:637
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:17951
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18673
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:748

References Unit::ClearUnitState(), Unit::DisableSpline(), Creature::GetHomePosition(), Position::GetOrientation(), Object::GetPackGUID(), GetSession(), Unit::GetTransGUID(), Creature::GetTransportHomePosition(), Object::GetTypeId(), Unit::HasUnitFlag(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), Unit::HasUnitTypeMask(), ObjectGuid::IsMOTransport(), MOVEMENTFLAG_ONTRANSPORT, WorldSession::SendPacket(), Unit::SetControlled(), Unit::SetFacingTo(), SetMover(), Position::SetOrientation(), SetViewpoint(), PackedGuid::size(), SMSG_CLIENT_CONTROL_UPDATE, Object::ToCreature(), TYPEID_UNIT, UNIT_FLAG_DISABLE_MOVE, UNIT_MASK_ACCESSORY, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, and UNIT_STATE_ROOT.

Referenced by Battleground::BlockMovement(), WorldSession::HandleMoveTeleportAck(), npc_pilgrims_bounty_chair::PassengerBoarded(), Unit::RemoveCharmedBy(), Unit::SetCharmedBy(), Unit::SetConfused(), and Unit::SetFeared().

◆ SetCommandStatusOff()

◆ SetCommandStatusOn()

◆ SetCommentator()

void Player::SetCommentator ( bool  on)
inline

◆ SetContestedPvPTimer()

void Player::SetContestedPvPTimer ( uint32  newTime)
inline
1845{m_contestedPvPTimer = newTime;}

References m_contestedPvPTimer.

Referenced by Unit::SetContestedPvP().

◆ SetCreationTime()

void Player::SetCreationTime ( Seconds  creationTime)
inline
2514{ m_creationTime = creationTime; }

References m_creationTime.

Referenced by LoadFromDB().

◆ SetCurrentRune()

void Player::SetCurrentRune ( uint8  index,
RuneType  currentRune 
)
inline
2491{ m_runes->runes[index].CurrentRune = currentRune; }

References RuneInfo::CurrentRune, m_runes, and Runes::runes.

Referenced by ConvertRune(), and InitRunes().

◆ SetCurrentTitle()

void Player::SetCurrentTitle ( CharTitlesEntry const *  title,
bool  clear = false 
)
inline
2520{ SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };

References CharTitlesEntry::bit_index, PLAYER_CHOSEN_TITLE, and Unit::SetUInt32Value().

Referenced by SetTitle().

◆ SetDailyQuestStatus()

void Player::SetDailyQuestStatus ( uint32  quest_id)
12043{
12044 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(quest_id))
12045 {
12046 if (!qQuest->IsDFQuest())
12047 {
12048 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12049 {
12050 if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
12051 {
12052 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
12053 m_lastDailyQuestTime = GameTime::GetGameTime().count(); // last daily quest time
12054 m_DailyQuestChanged = true;
12055 break;
12056 }
12057 }
12058 }
12059 else
12060 {
12061 m_DFQuests.insert(quest_id);
12063 m_DailyQuestChanged = true;
12064 }
12065 }
12066}

References GameTime::GetGameTime(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), and sObjectMgr.

Referenced by RewardQuest().

◆ setDeathState()

void Player::setDeathState ( DeathState  s,
bool  despawn = false 
)
overridevirtual

Reimplemented from Unit.

1014{
1015 uint32 ressSpellId = 0;
1016
1017 bool cur = IsAlive();
1018
1019 if (s == DeathState::JustDied)
1020 {
1021 if (!cur)
1022 {
1023 LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player {} ({})", GetName(), GetGUID().ToString());
1024 return;
1025 }
1026
1027 // drunken state is cleared on death
1028 SetDrunkValue(0);
1029 // lost combo points at any target (targeted combo points clear in Unit::setDeathState)
1031
1033
1034 //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DeathState::Dead) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
1035 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
1036
1037 // save value before aura remove in Unit::setDeathState
1039
1040 // xinef: disable passive area auras!
1042
1043 // passive spell
1044 if (!ressSpellId)
1045 ressSpellId = GetResurrectionSpellId();
1049
1050 // Xinef: reset all death criterias
1052 }
1053 // xinef: enable passive area auras!
1054 else if (s == DeathState::Alive)
1056
1058
1061
1062 // restore resurrection spell id for player after aura remove
1063 if (s == DeathState::JustDied && cur && ressSpellId)
1065
1066 if (IsAlive() && !cur)
1067 //clear aura case after resurrection by another way (spells will be applied before next death)
1069}
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH
Definition: DBCEnums.h:88
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition: DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition: DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition: DBCEnums.h:135
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12556
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: Player.cpp:13878
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14479

References ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, Unit::AddUnitState(), Unit::ClearComboPoints(), clearResurrectRequestData(), Unit::ClearUnitState(), WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetName(), GetResurrectionSpellId(), Object::GetUInt32Value(), Unit::IsAlive(), LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_NOT_IN_SLOT, PLAYER_SELF_RES_SPELL, RemovePet(), ResetAchievementCriteria(), ArenaSpectator::SendCommand_UInt32Value(), Unit::setDeathState(), SetDrunkValue(), Unit::SetUInt32Value(), Position::ToString(), UNIT_STATE_ISOLATED, and UpdateAchievementCriteria().

Referenced by KillPlayer(), and ResurrectPlayer().

◆ SetDeveloper()

void Player::SetDeveloper ( bool  on)
inline

◆ SetDisableGravity()

bool Player::SetDisableGravity ( bool  disable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15853{
15854 if (!packetOnly && !Unit::SetDisableGravity(disable))
15855 return false;
15856
15858 data << GetPackGUID();
15859 data << uint32(0);
15860 SendDirectMessage(&data);
15861
15862 data.Initialize(MSG_MOVE_GRAVITY_CHNG, 64);
15863 data << GetPackGUID();
15864 BuildMovementPacket(&data);
15865 SendMessageToSet(&data, false);
15866 return true;
15867}
@ SMSG_MOVE_GRAVITY_DISABLE
Definition: Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition: Opcodes.h:1262
@ MSG_MOVE_GRAVITY_CHNG
Definition: Opcodes.h:1264
virtual bool SetDisableGravity(bool disable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20467

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_GRAVITY_CHNG, SendDirectMessage(), SendMessageToSet(), Unit::SetDisableGravity(), SMSG_MOVE_GRAVITY_DISABLE, and SMSG_MOVE_GRAVITY_ENABLE.

Referenced by npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded().

◆ SetDivider()

◆ SetDrunkValue()

void Player::SetDrunkValue ( uint8  newDrunkValue,
uint32  itemId = 0 
)
971{
972 newDrunkValue = std::min<uint8>(newDrunkValue, 100);
973 if (newDrunkValue == GetDrunkValue())
974 return;
975
977 uint32 newDrunkenState = Player::GetDrunkenstateByValue(newDrunkValue);
978
981
982 m_drunkTimer = 0; // reset sobering timer
983
984 if (newDrunkenState == oldDrunkenState)
985 return;
986
988 data.Guid = GetGUID();
989 data.Threshold = newDrunkenState;
990 data.ItemID = itemId;
991
992 SendMessageToSet(data.Write(), true);
993}
@ PLAYER_BYTES_3_OFFSET_INEBRIATION
Definition: Player.h:529
void UpdateInvisibilityDrunkDetect()
Definition: Player.cpp:995
static DrunkenState GetDrunkenstateByValue(uint8 value)
Definition: Player.cpp:959
WorldPacket const * Write() override
Definition: MiscPackets.cpp:113
ObjectGuid Guid
Definition: MiscPackets.h:175
uint32 Threshold
Definition: MiscPackets.h:176
uint32 ItemID
Definition: MiscPackets.h:177

References GetDrunkenstateByValue(), GetDrunkValue(), Object::GetGUID(), WorldPackets::Misc::CrossedInebriationThreshold::Guid, WorldPackets::Misc::CrossedInebriationThreshold::ItemID, m_drunkTimer, PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, SendMessageToSet(), Object::SetByteValue(), WorldPackets::Misc::CrossedInebriationThreshold::Threshold, UpdateInvisibilityDrunkDetect(), and WorldPackets::Misc::CrossedInebriationThreshold::Write().

Referenced by Spell::EffectInebriate(), HandleSobering(), LoadFromDB(), and setDeathState().

◆ SetDungeonDifficulty()

void Player::SetDungeonDifficulty ( Difficulty  dungeon_difficulty)
inline

◆ SetEntryPoint()

void Player::SetEntryPoint ( )
11238{
11241
11242 if (!m_taxi.empty())
11243 {
11246
11249 }
11250 else
11251 {
11252 if (IsMounted())
11253 {
11255 if (!auras.empty())
11256 m_entryPointData.mountSpell = (*auras.begin())->GetId();
11257 }
11258 else
11260
11261 if (GetMap()->IsDungeon())
11262 {
11263 if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId()))
11264 m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f);
11265 }
11266 else if (!GetMap()->IsBattlegroundOrArena())
11268 }
11269
11272}
uint32 m_mapId
Definition: Position.h:319
bool empty() const
Definition: PlayerTaxi.h:73
uint32 GetTaxiDestination() const
Definition: PlayerTaxi.h:64
bool IsDungeon() const
Definition: Map.h:448
bool IsBattlegroundOrArena() const
Definition: Map.h:456

References EntryPointData::ClearTaxiPath(), PlayerTaxi::empty(), Unit::GetAuraEffectsByType(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), PlayerTaxi::GetTaxiDestination(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Map::IsBattlegroundOrArena(), Map::IsDungeon(), Unit::IsMounted(), EntryPointData::joinPos, m_entryPointData, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, WorldLocation::m_mapId, m_taxi, MAPID_INVALID, EntryPointData::mountSpell, sGraveyard, SPELL_AURA_MOUNTED, and EntryPointData::taxiPath.

Referenced by misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), and lfg::LFGMgr::TeleportPlayer().

◆ SetEquipmentSet()

void Player::SetEquipmentSet ( uint32  index,
EquipmentSet  eqset 
)
14454{
14455 if (eqset.Guid != 0)
14456 {
14457 bool found = false;
14458
14459 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14460 {
14461 if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
14462 {
14463 found = true;
14464 break;
14465 }
14466 }
14467
14468 if (!found) // something wrong...
14469 {
14470 LOG_ERROR("entities.player", "Player {} tried to save equipment set {} (index {}), but that equipment set not found!", GetName(), eqset.Guid, index);
14471 return;
14472 }
14473 }
14474
14475 EquipmentSet& eqslot = m_EquipmentSets[index];
14476
14477 EquipmentSetUpdateState old_state = eqslot.state;
14478
14479 eqslot = eqset;
14480
14481 if (eqset.Guid == 0)
14482 {
14483 eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
14484
14486 data << uint32(index);
14487 data.appendPackGUID(eqslot.Guid);
14488 GetSession()->SendPacket(&data);
14489 }
14490
14492}
EquipmentSetUpdateState
Definition: Player.h:741
@ SMSG_EQUIPMENT_SET_SAVED
Definition: Opcodes.h:341

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_NEW, WorldObject::GetName(), GetSession(), EquipmentSet::Guid, LOG_ERROR, m_EquipmentSets, WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_SAVED, sObjectMgr, and EquipmentSet::state.

Referenced by WorldSession::HandleEquipmentSetSave().

◆ SetFactionForRace()

void Player::SetFactionForRace ( uint8  race)
5806{
5807 m_team = TeamIdForRace(race);
5808
5809 sScriptMgr->OnPlayerUpdateFaction(this);
5810
5811 if (GetTeamId(true) != GetTeamId())
5812 return;
5813
5814 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
5815 SetFaction(rEntry ? rEntry->FactionID : 0);
5816}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
void SetFaction(uint32 faction)
Definition: Unit.cpp:9998
Definition: DBCStructure.h:679
uint32 FactionID
Definition: DBCStructure.h:682

References ChrRacesEntry::FactionID, GetTeamId(), m_team, sChrRacesStore, Unit::SetFaction(), sScriptMgr, and TeamIdForRace().

Referenced by Create(), reset_commandscript::HandleResetStatsOrLevelHelper(), LoadFromDB(), Unit::RestoreFaction(), and SetGameMaster().

◆ SetFallInformation()

◆ SetFarSightDistance()

void Player::SetFarSightDistance ( float  radius)
16220{
16221 _farSightDistance = radius;
16222}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ SetFeatherFall()

bool Player::SetFeatherFall ( bool  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

15934{
15935 // Xinef: moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15936 if (!packetOnly/* && !Unit::SetFeatherFall(apply)*/)
15937 {
15938 Unit::SetFeatherFall(apply);
15939 //return false;
15940 }
15941
15943 data << GetPackGUID();
15944 data << uint32(0);
15945 SendDirectMessage(&data);
15946
15947 data.Initialize(MSG_MOVE_FEATHER_FALL, 64);
15948 data << GetPackGUID();
15949 BuildMovementPacket(&data);
15950 SendMessageToSet(&data, false);
15951 return true;
15952}
@ SMSG_MOVE_FEATHER_FALL
Definition: Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition: Opcodes.h:273
@ MSG_MOVE_FEATHER_FALL
Definition: Opcodes.h:718
virtual bool SetFeatherFall(bool enable, bool packetOnly=false)
Definition: Unit.cpp:20554

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_FEATHER_FALL, SendDirectMessage(), SendMessageToSet(), Unit::SetFeatherFall(), SMSG_MOVE_FEATHER_FALL, and SMSG_MOVE_NORMAL_FALL.

◆ SetFreePrimaryProfessions()

void Player::SetFreePrimaryProfessions ( uint16  profs)
inline

◆ SetFreeTalentPoints()

void Player::SetFreeTalentPoints ( uint32  points)

◆ SetGameMaster()

void Player::SetGameMaster ( bool  on)
2205{
2206 if (on)
2207 {
2209 if (GetSession()->IsGMAccount())
2213
2214 if (Pet* pet = GetPet())
2215 {
2216 if (GetSession()->IsGMAccount())
2217 pet->SetFaction(FACTION_FRIENDLY);
2218 pet->getHostileRefMgr().setOnlineOfflineState(false);
2219 }
2221 {
2223 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2224 }
2226
2229
2230 SetPhaseMask(uint32(PHASEMASK_ANYWHERE), false); // see and visible in all phases
2232 }
2233 else
2234 {
2235 // restore phase
2236 uint32 newPhase = GetPhaseByAuras();
2237
2238 if (!newPhase)
2239 newPhase = PHASEMASK_NORMAL;
2240
2241 SetPhaseMask(newPhase, false);
2242
2243 m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
2247
2248 if (Pet* pet = GetPet())
2249 {
2250 pet->SetFaction(GetFaction());
2251 pet->getHostileRefMgr().setOnlineOfflineState(true);
2252 }
2253
2254 // restore FFA PvP Server state
2255 if (sWorld->IsFFAPvPRealm())
2256 {
2258 {
2260 sScriptMgr->OnFfaPvpStateUpdate(this, true);
2261 }
2262 }
2263 // restore FFA PvP area state, remove not allowed for GM mounts
2265
2268 }
2269
2271}
@ PHASEMASK_ANYWHERE
Definition: Object.h:60
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
Definition: UnitDefines.h:285
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
@ FACTION_FRIENDLY
Definition: SharedDefines.h:201
@ SEC_PLAYER
Definition: Common.h:56
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:370
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
Definition: Object.h:522
void ResetContestedPvP()
Definition: Player.h:1846
void UpdateArea(uint32 newArea)
Definition: PlayerUpdates.cpp:1170
uint32 GetFaction() const
Definition: Unit.h:840
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:18966
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10394

References Unit::CombatStopWithPets(), FACTION_FRIENDLY, Unit::GetFaction(), Unit::getHostileRefMgr(), GetPet(), Unit::GetPhaseByAuras(), Unit::getRace(), GetSession(), Object::HasByteFlag(), m_areaUpdateId, m_ExtraFlags, WorldObject::m_serverSideVisibilityDetect, PHASEMASK_ANYWHERE, PHASEMASK_NORMAL, PLAYER_EXTRA_GM_ON, PLAYER_FLAGS_GM, Object::RemoveByteFlag(), RemovePlayerFlag(), Unit::RemoveUnitFlag2(), ResetContestedPvP(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, Object::SetByteFlag(), Unit::SetFaction(), SetFactionForRace(), HostileRefMgr::setOnlineOfflineState(), Unit::SetPhaseMask(), SetPlayerFlag(), Unit::SetUnitFlag2(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS, UpdateArea(), and UpdateObjectVisibility().

Referenced by gm_commandscript::HandleGMOffCommand(), gm_commandscript::HandleGMOnCommand(), and LoadFromDB().

◆ SetGlyph()

void Player::SetGlyph ( uint8  slot,
uint32  glyph,
bool  save 
)
inline
1739 {
1740 m_Glyphs[m_activeSpec][slot] = glyph;
1742
1743 if (save)
1744 SetNeedToSaveGlyphs(true);
1745 }
@ PLAYER_FIELD_GLYPHS_1
Definition: UpdateFields.h:389

References m_activeSpec, m_Glyphs, PLAYER_FIELD_GLYPHS_1, SetNeedToSaveGlyphs(), and Unit::SetUInt32Value().

Referenced by _LoadGlyphAuras(), ActivateSpec(), Spell::EffectApplyGlyph(), and WorldSession::HandleRemoveGlyph().

◆ SetGlyphSlot()

void Player::SetGlyphSlot ( uint8  slot,
uint32  slottype 
)
inline

◆ SetGMChat()

void Player::SetGMChat ( bool  on)
inline
1160{ if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by LoadFromDB().

◆ SetGMVisible()

void Player::SetGMVisible ( bool  on)
2274{
2275 const uint32 VISUAL_AURA = 37800;
2276
2277 if (on)
2278 {
2279 RemoveAurasDueToSpell(VISUAL_AURA);
2280 m_ExtraFlags &= ~PLAYER_EXTRA_GM_INVISIBLE;
2282
2285 }
2286 else
2287 {
2288 AddAura(VISUAL_AURA, this);
2291 }
2292}
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:521

References Unit::AddAura(), Unit::CombatStopWithPets(), Unit::getHostileRefMgr(), GetSession(), m_ExtraFlags, WorldObject::m_serverSideVisibility, PLAYER_EXTRA_GM_INVISIBLE, Unit::RemoveAurasDueToSpell(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, HostileRefMgr::setOnlineOfflineState(), and FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue().

Referenced by gm_commandscript::HandleGMVisibleCommand(), and LoadFromDB().

◆ SetGracePeriod()

void Player::SetGracePeriod ( uint8  index,
uint32  period 
)
inline

◆ SetGrantableLevels()

void Player::SetGrantableLevels ( uint8  val)
inline

◆ SetGroup()

void Player::SetGroup ( Group group,
int8  subgroup = -1 
)
11516{
11517 if (!group)
11518 m_group.unlink();
11519 else
11520 {
11521 // never use SetGroup without a subgroup unless you specify nullptr for group
11522 ASSERT(subgroup >= 0);
11523 m_group.link(group, this);
11524 m_group.setSubGroup((uint8)subgroup);
11525 }
11526
11528}

References ASSERT, Reference< TO, FROM >::link(), m_group, GroupReference::setSubGroup(), Reference< TO, FROM >::unlink(), and UpdateObjectVisibility().

Referenced by _LoadGroup(), Group::AddMember(), Group::Disband(), and Group::RemoveMember().

◆ SetGroupInvite()

void Player::SetGroupInvite ( Group group)
inline

◆ SetGroupUpdateFlag()

◆ SetGuildIdInvited()

void Player::SetGuildIdInvited ( uint32  GuildId)
inline

◆ SetHas310Flyer()

void Player::SetHas310Flyer ( bool  on)
inline
1166{ if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }

References m_ExtraFlags, and PLAYER_EXTRA_HAS_310_FLYER.

Referenced by _addSpell(), and Has310Flyer().

◆ SetHasDelayedTeleport()

void Player::SetHasDelayedTeleport ( bool  setting)
inlineprivate
2910{ m_bHasDelayedTeleport = setting; }

References m_bHasDelayedTeleport.

Referenced by TeleportTo(), and Update().

◆ SetHomebind()

void Player::SetHomebind ( WorldLocation const &  loc,
uint32  areaId 
)
4912{
4913 loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ);
4914 m_homebindMapId = loc.GetMapId();
4915 m_homebindAreaId = areaId;
4916
4917 // update sql homebind
4919 stmt->SetData(0, m_homebindMapId);
4920 stmt->SetData(1, m_homebindAreaId);
4921 stmt->SetData (2, m_homebindX);
4922 stmt->SetData (3, m_homebindY);
4923 stmt->SetData (4, m_homebindZ);
4924 stmt->SetData(5, GetGUID().GetCounter());
4925 CharacterDatabase.Execute(stmt);
4926}
@ CHAR_UPD_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:241

References CHAR_UPD_PLAYER_HOMEBIND, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPosition(), m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, and PreparedStatementBase::SetData().

Referenced by Spell::EffectBind().

◆ SetHonorPoints()

void Player::SetHonorPoints ( uint32  value)
6198{
6199 if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
6200 {
6201 if (int32 copperPerPoint = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT))
6202 {
6203 // Only convert points on login, not when awarded honor points.
6204 if (isBeingLoaded())
6205 {
6206 int32 excessPoints = value - sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6207 ModifyMoney(excessPoints * copperPerPoint);
6208 }
6209 }
6210
6211 value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6212 }
6214 if (value)
6216}
@ ITEM_HONOR_POINTS_ID
Definition: Player.h:959
@ CONFIG_MAX_HONOR_POINTS
Definition: IWorld.h:246
@ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT
Definition: IWorld.h:247

References AddKnownCurrency(), CONFIG_MAX_HONOR_POINTS, CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, isBeingLoaded(), ITEM_HONOR_POINTS_ID, ModifyMoney(), PLAYER_FIELD_HONOR_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), reset_commandscript::HandleResetHonorCommand(), LoadFromDB(), and ModifyHonorPoints().

◆ SetHover()

bool Player::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15892{
15893 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15894 if (!packetOnly /* && !Unit::SetHover(apply)*/)
15895 {
15896 Unit::SetHover(apply);
15897 // return false;
15898 }
15899
15901 data << GetPackGUID();
15902 data << uint32(0);
15903 SendDirectMessage(&data);
15904
15905 data.Initialize(MSG_MOVE_HOVER, 64);
15906 data << GetPackGUID();
15907 BuildMovementPacket(&data);
15908 SendMessageToSet(&data, false);
15909 return true;
15910}
@ MSG_MOVE_HOVER
Definition: Opcodes.h:277
@ SMSG_MOVE_SET_HOVER
Definition: Opcodes.h:274
@ SMSG_MOVE_UNSET_HOVER
Definition: Opcodes.h:275
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20576

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_HOVER, SendDirectMessage(), SendMessageToSet(), Unit::SetHover(), SMSG_MOVE_SET_HOVER, and SMSG_MOVE_UNSET_HOVER.

◆ SetInArenaTeam()

void Player::SetInArenaTeam ( uint32  ArenaTeamId,
uint8  slot,
uint8  type 
)
inline
1884 {
1885 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
1887 }

References ARENA_TEAM_ID, ARENA_TEAM_TYPE, and SetArenaTeamInfoField().

Referenced by ArenaTeam::AddMember().

◆ SetInGameTime()

void Player::SetInGameTime ( uint32  time)
inline

◆ SetInGuild()

void Player::SetInGuild ( uint32  GuildId)
inline

◆ SetInviteForBattlegroundQueueType()

void Player::SetInviteForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId,
uint32  instanceId 
)
12234{
12235 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12236 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12237 _BgBattlegroundQueueID[i].invitedToInstance = instanceId;
12238}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BattlegroundQueue::InviteGroupToBG().

◆ SetInWater()

void Player::SetInWater ( bool  apply)
2162{
2163 if (m_isInWater == apply)
2164 return;
2165
2166 //define player in water by opcodes
2167 //move player's guid into HateOfflineList of those mobs
2168 //which can't swim and move guid back into ThreatList when
2169 //on surface.
2170 //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water
2172
2173 // remove auras that need water/land
2175
2177
2178 if (InstanceScript* instance = GetInstanceScript())
2179 instance->OnPlayerInWaterStateUpdate(this, apply);
2180}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:51
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:52
void updateThreatTables()
Definition: HostileRefMgr.cpp:111

References AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, Unit::getHostileRefMgr(), WorldObject::GetInstanceScript(), m_isInWater, Unit::RemoveAurasWithInterruptFlags(), and HostileRefMgr::updateThreatTables().

Referenced by WorldSession::HandleMovementOpcodes().

◆ SetIsSpectator()

void Player::SetIsSpectator ( bool  on)
15306{
15307 if (on)
15308 {
15312 //SetFaction(1100);
15315 {
15317 sScriptMgr->OnFfaPvpStateUpdate(this, false);
15318 }
15320 SetDisplayId(23691);
15321 }
15322 else
15323 {
15325 if (IsSpectator())
15327 m_ExtraFlags &= ~PLAYER_EXTRA_SPECTATOR_ON;
15330
15331 if (!IsGameMaster())
15332 {
15333 //SetFactionForRace(getRace());
15334
15335 // restore FFA PvP Server state
15336 // Xinef: it will be removed if necessery in UpdateArea called in WorldPortOpcode
15337 if (sWorld->IsFFAPvPRealm())
15338 {
15340 {
15342 sScriptMgr->OnFfaPvpStateUpdate(this, true);
15343
15344 }
15345 }
15346 }
15347 }
15348}
#define SPECTATOR_SPELL_SPEED
Definition: ArenaSpectator.h:39
void RestoreDisplayId()
Definition: Unit.cpp:16703

References Unit::AddAura(), Unit::AddUnitState(), Unit::ClearUnitState(), Object::HasByteFlag(), IsGameMaster(), IsSpectator(), m_ExtraFlags, PLAYER_EXTRA_SPECTATOR_ON, Unit::RemoveAurasDueToSpell(), Object::RemoveByteFlag(), Unit::RemoveUnitFlag(), ResetContestedPvP(), Unit::RestoreDisplayId(), Object::SetByteFlag(), Unit::SetDisplayId(), Unit::SetUnitFlag(), SPECTATOR_SPELL_SPEED, sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, and UNIT_STATE_ISOLATED.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetLastPetNumber()

void Player::SetLastPetNumber ( uint32  petnumber)
inline
2434{ m_lastpetnumber = petnumber; }

References m_lastpetnumber.

Referenced by Pet::LoadPetFromDB().

◆ SetLastPetSpell()

void Player::SetLastPetSpell ( uint32  petspell)
inline
2436{ m_oldpetspell = petspell; }

References m_oldpetspell.

Referenced by Pet::LoadPetFromDB(), and UnsummonPetTemporaryIfAny().

◆ SetLastPotionId()

void Player::SetLastPotionId ( uint32  item_id)
inline
1789{ m_lastPotionId = item_id; }

References m_lastPotionId.

Referenced by Spell::SendSpellCooldown(), and UpdatePotionCooldown().

◆ SetLastUsedRune()

void Player::SetLastUsedRune ( RuneType  type)
inline
2489{ m_runes->lastUsedRune = type; }

References Runes::lastUsedRune, and m_runes.

Referenced by Spell::TakeRunePower().

◆ SetLootGUID()

void Player::SetLootGUID ( ObjectGuid  guid)
inline
1970{ m_lootGuid = guid; }

References m_lootGuid.

Referenced by WorldSession::DoLootRelease(), and SendLoot().

◆ SetMap()

void Player::SetMap ( Map map)
overridevirtual

Reimplemented from WorldObject.

14623{
14624 Unit::SetMap(map);
14625 m_mapRef.link(map, this);
14626}
virtual void SetMap(Map *map)
Definition: Object.cpp:2105

References Reference< TO, FROM >::link(), m_mapRef, and WorldObject::SetMap().

Referenced by Map::AddPlayerToMap(), Create(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleSetRaidDifficultyOpcode(), and LoadFromDB().

◆ SetMoney()

void Player::SetMoney ( uint32  value)
inline

◆ SetMonthlyQuestStatus()

void Player::SetMonthlyQuestStatus ( uint32  quest_id)
12101{
12102 m_monthlyquests.insert(quest_id);
12103 m_MonthlyQuestChanged = true;
12104}

References m_MonthlyQuestChanged, and m_monthlyquests.

Referenced by RewardQuest().

◆ SetMountBlockId()

void Player::SetMountBlockId ( uint32  mount)
inline

◆ SetMovement()

void Player::SetMovement ( PlayerMovementType  pType)
4337{
4338 WorldPacket data;
4339 switch (pType)
4340 {
4341 case MOVE_ROOT:
4342 data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
4343 break;
4344 case MOVE_UNROOT:
4345 data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
4346 break;
4347 case MOVE_WATER_WALK:
4348 data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4);
4349 break;
4350 case MOVE_LAND_WALK:
4351 data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
4352 break;
4353 default:
4354 LOG_ERROR("entities.player", "Player::SetMovement: Unsupported move type ({}), data not sent to client.", pType);
4355 return;
4356 }
4357 data << GetPackGUID();
4358 data << uint32(0);
4359 GetSession()->SendPacket(&data);
4360}
@ SMSG_MOVE_LAND_WALK
Definition: Opcodes.h:253
@ SMSG_MOVE_WATER_WALK
Definition: Opcodes.h:252
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264

References Object::GetPackGUID(), GetSession(), WorldPacket::Initialize(), LOG_ERROR, MOVE_LAND_WALK, MOVE_ROOT, MOVE_UNROOT, MOVE_WATER_WALK, WorldSession::SendPacket(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), WorldSession::HandlePlayerLoginFromDB(), cheat_commandscript::HandleWaterWalkCheatCommand(), KillPlayer(), ResurrectPlayer(), and SendInitialPacketsAfterAddToMap().

◆ SetMover()

void Player::SetMover ( Unit target)
12844{
12845 if (this != target && target->m_movedByPlayer && target->m_movedByPlayer != target && target->m_movedByPlayer != this)
12846 {
12847 LOG_INFO("misc", "Player::SetMover (A1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12848 LOG_INFO("misc", "Player::SetMover (A2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12849 LOG_INFO("misc", "Player::SetMover (A3) - {}, {}, {}, {}, {}, {}, {}, {}", target->m_movedByPlayer->GetGUID().ToString(), target->m_movedByPlayer->GetMapId(), target->m_movedByPlayer->GetInstanceId(), target->m_movedByPlayer->FindMap()->GetId(), target->m_movedByPlayer->IsInWorld() ? 1 : 0, target->m_movedByPlayer->IsDuringRemoveFromWorld() ? 1 : 0, target->m_movedByPlayer->ToPlayer()->IsBeingTeleported() ? 1 : 0, target->m_movedByPlayer->isBeingLoaded() ? 1 : 0);
12850 }
12851 if (this != target && (!target->IsInWorld() || target->IsDuringRemoveFromWorld() || GetMapId() != target->GetMapId() || GetInstanceId() != target->GetInstanceId()))
12852 {
12853 LOG_INFO("misc", "Player::SetMover (B1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12854 LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12855 }
12856 m_mover->m_movedByPlayer = nullptr;
12857 if (m_mover->GetTypeId() == TYPEID_UNIT)
12859
12860 m_mover = target;
12861 m_mover->m_movedByPlayer = this;
12862 if (m_mover->GetTypeId() == TYPEID_UNIT)
12864}
virtual bool isBeingLoaded() const
Definition: Unit.h:1738
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:1739
void Initialize()
Definition: MotionMaster.cpp:73

References WorldObject::FindMap(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), Object::GetTypeId(), MotionMaster::Initialize(), Unit::isBeingLoaded(), isBeingLoaded(), IsBeingTeleported(), Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), LOG_INFO, Unit::m_movedByPlayer, m_mover, Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), and TYPEID_UNIT.

Referenced by SendInitialPacketsBeforeAddToMap(), and SetClientControl().

◆ SetMustDelayTeleport()

void Player::SetMustDelayTeleport ( bool  setting)
inlineprivate
2908{ m_bMustDelayTeleport = setting; }

References m_bMustDelayTeleport.

Referenced by RewardQuest(), and Update().

◆ SetNeedToSaveGlyphs()

void Player::SetNeedToSaveGlyphs ( bool  val)
inline
2578{ m_NeedToSaveGlyphs = val; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs(), and SetGlyph().

◆ SetNeedZoneUpdate()

void Player::SetNeedZoneUpdate ( bool  needUpdate)
inline
1836{ m_needZoneUpdate = needUpdate; }

References m_needZoneUpdate.

Referenced by WorldSession::HandleZoneUpdateOpcode().

◆ SetObjectScale()

void Player::SetObjectScale ( float  scale)
inlineoverridevirtual

Reimplemented from Object.

1078 {
1079 Unit::SetObjectScale(scale);
1082 }
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
@ UNIT_FIELD_COMBATREACH
Definition: UpdateFields.h:123
@ UNIT_FIELD_BOUNDINGRADIUS
Definition: UpdateFields.h:122
virtual void SetObjectScale(float scale)
Definition: Object.h:116

References DEFAULT_COMBAT_REACH, DEFAULT_WORLD_OBJECT_SIZE, Object::SetFloatValue(), Object::SetObjectScale(), UNIT_FIELD_BOUNDINGRADIUS, and UNIT_FIELD_COMBATREACH.

Referenced by Create(), InitStatsForLevel(), and LoadFromDB().

◆ SetOriginalGroup()

void Player::SetOriginalGroup ( Group group,
int8  subgroup = -1 
)
13060{
13061 if (!group)
13063 else
13064 {
13065 // never use SetOriginalGroup without a subgroup unless you specify nullptr for group
13066 ASSERT(subgroup >= 0);
13067 m_originalGroup.link(group, this);
13069 }
13070}

References ASSERT, Reference< TO, FROM >::link(), m_originalGroup, GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Group::Disband(), RemoveFromBattlegroundOrBattlefieldRaid(), Group::RemoveMember(), and SetBattlegroundOrBattlefieldRaid().

◆ SetPassOnGroupLoot()

void Player::SetPassOnGroupLoot ( bool  bPassOnGroupLoot)
inline
2464{ m_bPassOnGroupLoot = bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by WorldSession::HandleOptOutOfLootOpcode().

◆ SetPendingBind()

void Player::SetPendingBind ( uint32  instanceId,
uint32  bindTimer 
)
inline

◆ SetPendingSpectatorForBG()

void Player::SetPendingSpectatorForBG ( uint32  bgInstanceId)
inline

◆ SetPendingSpectatorInviteInstanceId()

void Player::SetPendingSpectatorInviteInstanceId ( uint32  bgInstanceId)
inline

◆ SetPlayerFlag()

◆ SetPvP()

void Player::SetPvP ( bool  state)
inline
1827 {
1828 Unit::SetPvP(state);
1829 if (!m_Controlled.empty())
1830 for (auto& itr : m_Controlled)
1831 itr->SetPvP(state);
1832 }
ControlSet m_Controlled
Definition: Unit.h:1210
void SetPvP(bool state)
Definition: Unit.h:864

References Unit::m_Controlled, and Unit::SetPvP().

Referenced by UpdatePvP().

◆ SetPvPDeath()

void Player::SetPvPDeath ( bool  on)
inline
1167{ if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }

References m_ExtraFlags, and PLAYER_EXTRA_PVP_DEATH.

Referenced by CreateCorpse().

◆ SetQuestSlot()

◆ SetQuestSlotCounter()

void Player::SetQuestSlotCounter ( uint16  slot,
uint8  counter,
uint16  count 
)
inline

◆ SetQuestSlotState()

void Player::SetQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ SetQuestSlotTimer()

void Player::SetQuestSlotTimer ( uint16  slot,
uint32  timer 
)
inline

◆ SetQuestStatus()

void Player::SetQuestStatus ( uint32  questId,
QuestStatus  status,
bool  update = true 
)
1474{
1475 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
1476 {
1477 m_QuestStatus[questId].Status = status;
1478
1479 if (quest->GetQuestMethod() && !quest->IsAutoComplete())
1480 {
1481 m_QuestStatusSave[questId] = true;
1482 }
1483 }
1484
1485 if (update)
1486 SendQuestUpdate(questId);
1487}

References m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), and sObjectMgr.

Referenced by CompleteQuest(), FailQuest(), IncompleteQuest(), and npc_finklestein::npc_finklesteinAI::RightClickCauldron().

◆ SetRaidDifficulty()

void Player::SetRaidDifficulty ( Difficulty  raid_difficulty)
inline

◆ SetRandomWinner()

void Player::SetRandomWinner ( bool  isWinner)
15656{
15657 m_IsBGRandomWinner = isWinner;
15659 {
15661 stmt->SetData(0, GetGUID().GetCounter());
15662 CharacterDatabase.Execute(stmt);
15663 }
15664}
@ CHAR_INS_BATTLEGROUND_RANDOM
Definition: CharacterDatabase.h:64

References CHAR_INS_BATTLEGROUND_RANDOM, CharacterDatabase, Object::GetGUID(), m_IsBGRandomWinner, and PreparedStatementBase::SetData().

◆ SetRank()

void Player::SetRank ( uint8  rankId)
inline

◆ setRegenTimerCount()

void Player::setRegenTimerCount ( uint32  time)
inline
1589{m_regenTimerCount = time;}

References m_regenTimerCount.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetRegularAttackTime()

void Player::SetRegularAttackTime ( )
5237{
5238 for (uint8 i = 0; i < MAX_ATTACK; ++i)
5239 {
5240 Item* tmpitem = GetWeaponForAttack(WeaponAttackType(i), true);
5241 if (tmpitem && !tmpitem->IsBroken())
5242 {
5243 ItemTemplate const* proto = tmpitem->GetTemplate();
5244 if (proto->Delay)
5246 }
5247 else
5248 SetAttackTime(WeaponAttackType(i), BASE_ATTACK_TIME); // If there is no weapon reset attack time to base (might have been changed from forms)
5249 }
5250}

References BASE_ATTACK_TIME, ItemTemplate::Delay, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), MAX_ATTACK, and Unit::SetAttackTime().

Referenced by InitDataForForm().

◆ SetReputation()

void Player::SetReputation ( uint32  factionentry,
float  value 
)
15284{
15285 GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
15286}
bool SetReputation(FactionEntry const *factionEntry, float standing)
Definition: ReputationMgr.h:114

References GetReputationMgr(), ReputationMgr::SetReputation(), and sFactionStore.

◆ SetRestBonus()

void Player::SetRestBonus ( float  rest_bonus_new)
10156{
10157 // Prevent resting on max level
10158 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10159 rest_bonus_new = 0;
10160
10161 if (rest_bonus_new < 0)
10162 rest_bonus_new = 0;
10163
10164 float rest_bonus_max = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * 1.5f / 2;
10165
10166 if (rest_bonus_new > rest_bonus_max)
10167 _restBonus = rest_bonus_max;
10168 else
10169 _restBonus = rest_bonus_new;
10170
10171 // update data for client
10172 if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0)))
10174 else
10175 {
10176 if (_restBonus > 10)
10178 else if (_restBonus <= 1)
10180 }
10181
10182 //RestTickUpdate
10184}
@ PLAYER_REST_STATE_EXPERIENCE
Definition: UpdateFields.h:358
@ REST_STATE_RESTED
Definition: Player.h:983

References _restBonus, CONFIG_MAX_PLAYER_LEVEL, Unit::GetLevel(), GetSession(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), PLAYER_BYTES_2, PLAYER_NEXT_LEVEL_XP, PLAYER_REST_STATE_EXPERIENCE, REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, REST_STATE_RESTED, Object::SetByteValue(), Unit::SetUInt32Value(), and sWorld.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ SetRestFlag()

void Player::SetRestFlag ( RestFlag  restFlag,
uint32  triggerId = 0 
)
16100{
16101 uint32 oldRestMask = _restFlagMask;
16102 _restFlagMask |= restFlag;
16103
16104 if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state
16105 {
16106 _restTime = GameTime::GetGameTime().count();
16108 }
16109
16110 if (triggerId)
16111 _innTriggerId = triggerId;
16112}

References _innTriggerId, _restFlagMask, _restTime, GameTime::GetGameTime(), PLAYER_FLAGS_RESTING, and SetPlayerFlag().

Referenced by WorldSession::HandleAreaTriggerOpcode(), LoadFromDB(), UpdateArea(), and UpdateZone().

◆ SetRestState()

void Player::SetRestState ( uint32  triggerId)

◆ setResurrectRequestData()

void Player::setResurrectRequestData ( ObjectGuid  guid,
uint32  mapId,
float  X,
float  Y,
float  Z,
uint32  health,
uint32  mana 
)
inline

◆ SetRuneConvertAura()

void Player::SetRuneConvertAura ( uint8  index,
AuraEffect const *  aura 
)
inline

◆ SetRuneCooldown()

void Player::SetRuneCooldown ( uint8  index,
uint32  cooldown 
)
inline

◆ setRuneWeaponGUID()

void Player::setRuneWeaponGUID ( ObjectGuid  guid)
inline
2568{ m_drwGUID = guid; };

References m_drwGUID.

◆ SetSaveTimer()

void Player::SetSaveTimer ( uint32  timer)
inline
2332{ m_nextSave = timer; }

References m_nextSave.

◆ SetSeasonalQuestStatus()

void Player::SetSeasonalQuestStatus ( uint32  quest_id)
12091{
12092 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
12093 if (!quest)
12094 return;
12095
12096 m_seasonalquests[quest->GetEventIdForQuest()].insert(quest_id);
12098}
uint16 GetEventIdForQuest() const
Definition: QuestDef.h:331

References Quest::GetEventIdForQuest(), m_SeasonalQuestChanged, m_seasonalquests, and sObjectMgr.

Referenced by RewardQuest().

◆ SetSeer()

void Player::SetSeer ( WorldObject target)
inline
2325{ m_seer = target; }

References m_seer.

Referenced by WorldSession::HandleFarSightOpcode(), and SetViewpoint().

◆ SetSelection()

void Player::SetSelection ( ObjectGuid  guid)

Used for serverside target changes, does not apply to players.

11508{
11510
11513}
void SendCommand_GUID(T *o, ObjectGuid targetGUID, const char *prefix, ObjectGuid t)
Definition: ArenaSpectator.h:71

References WorldObject::FindMap(), Object::GetGUID(), NeedSendSpectatorData(), ArenaSpectator::SendCommand_GUID(), Object::SetGuidValue(), and UNIT_FIELD_TARGET.

Referenced by WorldSession::HandleSetSelectionOpcode(), and TeleportTo().

◆ SetSemaphoreTeleportFar()

void Player::SetSemaphoreTeleportFar ( time_t  tm)
inline

◆ SetSemaphoreTeleportNear()

void Player::SetSemaphoreTeleportNear ( time_t  tm)
inline

◆ SetServerSideVisibility()

void Player::SetServerSideVisibility ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16206{
16207 sScriptMgr->OnSetServerSideVisibility(this, type, sec);
16208
16210}

References WorldObject::m_serverSideVisibility, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetServerSideVisibilityDetect()

void Player::SetServerSideVisibilityDetect ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16213{
16214 sScriptMgr->OnSetServerSideVisibilityDetect(this, type, sec);
16215
16217}

References WorldObject::m_serverSideVisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetSession()

void Player::SetSession ( WorldSession sess)
inline
1975{ m_session = sess; }

References m_session.

Referenced by WorldSession::HandlePlayerLoginOpcode().

◆ SetSheath()

void Player::SetSheath ( SheathState  sheathed)
overridevirtual

Reimplemented from Unit.

104{
105 switch (sheathed)
106 {
107 case SHEATH_STATE_UNARMED: // no prepared weapon
108 SetVirtualItemSlot(0, nullptr);
109 SetVirtualItemSlot(1, nullptr);
110 SetVirtualItemSlot(2, nullptr);
111 break;
112 case SHEATH_STATE_MELEE: // prepared melee weapon
115 SetVirtualItemSlot(2, nullptr);
116 break;
117 case SHEATH_STATE_RANGED: // prepared ranged weapon
118 SetVirtualItemSlot(0, nullptr);
119 SetVirtualItemSlot(1, nullptr);
121 break;
122 default:
123 SetVirtualItemSlot(0, nullptr);
124 SetVirtualItemSlot(1, nullptr);
125 SetVirtualItemSlot(2, nullptr);
126 break;
127 }
128 Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players...
129}
@ SHEATH_STATE_UNARMED
Definition: UnitDefines.h:105
@ SHEATH_STATE_MELEE
Definition: UnitDefines.h:106
@ SHEATH_STATE_RANGED
Definition: UnitDefines.h:107
void SetVirtualItemSlot(uint8 i, Item *item)
Definition: PlayerStorage.cpp:83
virtual void SetSheath(SheathState sheathed)
Definition: Unit.h:837

References BASE_ATTACK, GetWeaponForAttack(), OFF_ATTACK, RANGED_ATTACK, Unit::SetSheath(), SetVirtualItemSlot(), SHEATH_STATE_MELEE, SHEATH_STATE_RANGED, and SHEATH_STATE_UNARMED.

Referenced by WorldSession::HandleSetSheathedOpcode().

◆ SetShowDKPet()

void Player::SetShowDKPet ( bool  on)
inline

◆ SetSkill()

void Player::SetSkill ( uint16  id,
uint16  step,
uint16  currVal,
uint16  maxVal 
)
5273{
5274 if (!id)
5275 return;
5276
5277 uint16 currVal;
5278 SkillStatusMap::iterator itr = mSkillStatus.find(id);
5279
5280 //has skill
5281 if (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED)
5282 {
5283 currVal = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)));
5284 if (newVal)
5285 {
5286 // if skill value is going down, update enchantments before setting the new value
5287 if (newVal < currVal)
5288 UpdateSkillEnchantments(id, currVal, newVal);
5289 // update step
5290 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
5291 // update value
5292 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), MAKE_SKILL_VALUE(newVal, maxVal));
5293 if (itr->second.uState != SKILL_NEW)
5294 itr->second.uState = SKILL_CHANGED;
5295 learnSkillRewardedSpells(id, newVal);
5296 // if skill value is going up, update enchantments after setting the new value
5297 if (newVal > currVal)
5298 UpdateSkillEnchantments(id, currVal, newVal);
5301 }
5302 else //remove
5303 {
5304 //remove enchantments needing this skill
5305 UpdateSkillEnchantments(id, currVal, 0);
5306 // clear skill fields
5307 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), 0);
5308 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), 0);
5309 SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos), 0);
5310
5311 // mark as deleted or simply remove from map if not saved yet
5312 if (itr->second.uState != SKILL_NEW)
5313 itr->second.uState = SKILL_DELETED;
5314 else
5315 mSkillStatus.erase(itr);
5316
5317 // remove all spells that related to this skill
5319 removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false);
5320 }
5321 }
5322 else if (newVal) //add
5323 {
5324 currVal = 0;
5325 for (int i = 0; i < PLAYER_MAX_SKILLS; ++i)
5327 {
5328 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id);
5329 if (!pSkill)
5330 {
5331 LOG_ERROR("entities.player", "Skill not found in SkillLineStore: skill #{}", id);
5332 return;
5333 }
5334
5337 UpdateSkillEnchantments(id, currVal, newVal);
5338
5339 // insert new entry or update if not deleted old entry yet
5340 if (itr != mSkillStatus.end())
5341 {
5342 itr->second.pos = i;
5343 itr->second.uState = SKILL_CHANGED;
5344 }
5345 else
5346 mSkillStatus.insert(SkillStatusMap::value_type(id, SkillStatusData(i, SKILL_NEW)));
5347
5348 // apply skill bonuses
5350
5351 // temporary bonuses
5353 for (AuraEffectList::const_iterator j = mModSkill.begin(); j != mModSkill.end(); ++j)
5354 if ((*j)->GetMiscValue() == int32(id))
5355 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5356
5357 // permanent bonuses
5359 for (AuraEffectList::const_iterator j = mModSkillTalent.begin(); j != mModSkillTalent.end(); ++j)
5360 if ((*j)->GetMiscValue() == int32(id))
5361 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5362
5363 // Learn all spells for skill
5364 learnSkillRewardedSpells(id, newVal);
5367 return;
5368 }
5369 }
5370}
@ SPELL_AURA_MOD_SKILL
Definition: SpellAuraDefines.h:93
@ SPELL_AURA_MOD_SKILL_TALENT
Definition: SpellAuraDefines.h:161
@ AURA_EFFECT_HANDLE_SKILL
Definition: SpellAuraDefines.h:47
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition: DBCEnums.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition: DBCEnums.h:154
void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value)
Definition: PlayerStorage.cpp:4696

References ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, AURA_EFFECT_HANDLE_SKILL, Unit::GetAuraEffectsByType(), GetSkillLineAbilitiesBySkillLine(), Object::GetUInt32Value(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, removeSpell(), Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_NEW, SKILL_VALUE, SPEC_MASK_ALL, SPELL_AURA_MOD_SKILL, SPELL_AURA_MOD_SKILL_TALENT, sSkillLineStore, sSpellMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by _addSpell(), Spell::EffectLearnSkill(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllRecipesCommand(), misc_commandscript::HandleSetSkillCommand(), WorldSession::HandleUnlearnSkillOpcode(), LearnDefaultSkill(), and removeSpell().

◆ SetSpecsCount()

void Player::SetSpecsCount ( uint8  count)
inline
1724{ m_specsCount = count; }

References m_specsCount.

Referenced by UpdateSpecCount().

◆ SetSpellModTakingSpell()

void Player::SetSpellModTakingSpell ( Spell spell,
bool  apply 
)
10034{
10035 if (apply && m_spellModTakingSpell)
10036 {
10037 LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10038 return;
10039 //ASSERT(m_spellModTakingSpell == nullptr);
10040 }
10041 else if (!apply)
10042 {
10044 LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id);
10045 else if (m_spellModTakingSpell != spell)
10046 {
10047 LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10048 return;
10049 }
10050 //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell);
10051 }
10052
10053 m_spellModTakingSpell = apply ? spell : nullptr;
10054}

References SpellInfo::Id, LOG_INFO, Spell::m_spellInfo, and m_spellModTakingSpell.

Referenced by Spell::_cast(), Spell::cast(), Spell::handle_delayed(), Unit::HandleDummyAuraProc(), and Aura::UpdateOwner().

◆ SetSummonAsSpectator()

void Player::SetSummonAsSpectator ( bool  on)
inline

◆ SetSummonPoint()

void Player::SetSummonPoint ( uint32  mapid,
float  x,
float  y,
float  z,
uint32  delay = 0,
bool  asSpectator = false 
)
16268{
16269 m_summon_expire = GameTime::GetGameTime().count() + (delay ? delay : MAX_PLAYER_SUMMON_DELAY);
16270 m_summon_mapid = mapid;
16271 m_summon_x = x;
16272 m_summon_y = y;
16273 m_summon_z = z;
16274 m_summon_asSpectator = asSpectator;
16275}
#define MAX_PLAYER_SUMMON_DELAY
Definition: Player.h:928

References GameTime::GetGameTime(), m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, and MAX_PLAYER_SUMMON_DELAY.

Referenced by Spell::EffectSummonPlayer(), and Spell::EffectSummonRaFFriend().

◆ SetTarget()

void Player::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
inlineoverridevirtual

Implements Unit.

1622{ }

◆ SetTaxiCheater()

void Player::SetTaxiCheater ( bool  on)
inline

◆ setTeamId()

void Player::setTeamId ( TeamId  teamid)
inline
2086{ m_team = teamid; };

References m_team.

◆ SetTemporaryUnsummonedPetNumber()

void Player::SetTemporaryUnsummonedPetNumber ( uint32  petnumber)
inline

◆ SetTitle()

void Player::SetTitle ( CharTitlesEntry const *  title,
bool  lost = false 
)
13283{
13284 uint32 fieldIndexOffset = title->bit_index / 32;
13285 uint32 flag = 1 << (title->bit_index % 32);
13286
13287 if (lost)
13288 {
13289 if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13290 return;
13291
13292 // Clear the current title if it is the one being removed.
13293 if (title->bit_index == GetUInt32Value(PLAYER_CHOSEN_TITLE))
13294 {
13295 SetCurrentTitle(nullptr, true);
13296 }
13297
13298 RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13299 }
13300 else
13301 {
13302 if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13303 return;
13304
13305 SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13306 }
13307
13308 WorldPacket data(SMSG_TITLE_EARNED, 4 + 4);
13309 data << uint32(title->bit_index);
13310 data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost
13311 GetSession()->SendPacket(&data);
13312
13314}
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK
Definition: DBCEnums.h:158
@ SMSG_TITLE_EARNED
Definition: Opcodes.h:913
void SetCurrentTitle(CharTitlesEntry const *title, bool clear=false)
Definition: Player.h:2520

References ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, CharTitlesEntry::bit_index, GetSession(), Object::GetUInt32Value(), Object::HasFlag(), PLAYER__FIELD_KNOWN_TITLES, PLAYER_CHOSEN_TITLE, Object::RemoveFlag(), WorldSession::SendPacket(), SetCurrentTitle(), Object::SetFlag(), SMSG_TITLE_EARNED, and UpdateAchievementCriteria().

Referenced by _LoadQuestStatusRewarded(), AchievementMgr::CompletedAchievement(), titles_commandscript::HandleTitlesAddCommand(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), AchievementMgr::LoadFromDB(), and RewardQuest().

◆ SetViewpoint()

void Player::SetViewpoint ( WorldObject target,
bool  apply 
)
13117{
13118 if (apply)
13119 {
13120 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} create seer {} (TypeId: {}).", GetName(), target->GetEntry(), target->GetTypeId());
13121
13122 if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13123 {
13124 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot add new viewpoint!", GetName());
13125 return;
13126 }
13127
13128 // farsight dynobj or puppet may be very far away
13129 UpdateVisibilityOf(target);
13130
13131 if (target->isType(TYPEMASK_UNIT) && !GetVehicle())
13132 ((Unit*)target)->AddPlayerToVision(this);
13133 SetSeer(target);
13134 }
13135 else
13136 {
13137 //must immediately set seer back otherwise may crash
13138 m_seer = this;
13139
13140 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} remove seer", GetName());
13141
13142 if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13143 {
13144 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot remove current viewpoint!", GetName());
13145 return;
13146 }
13147
13148 if (target->isType(TYPEMASK_UNIT) && !GetVehicle())
13149 static_cast<Unit*>(target)->RemovePlayerFromVision(this);
13150
13151 // must immediately set seer back otherwise may crash
13152 SetSeer(this);
13153
13154 //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
13155 //GetSession()->SendPacket(&data);
13156 }
13157}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704
void SetSeer(WorldObject *target)
Definition: Player.h:2325
void UpdateVisibilityOf(WorldObject *target)
Definition: PlayerUpdates.cpp:1667

References Object::AddGuidValue(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::GetVehicle(), Object::isType(), LOG_DEBUG, m_seer, PLAYER_FARSIGHT, Object::RemoveGuidValue(), Unit::RemovePlayerFromVision(), SetSeer(), TYPEMASK_UNIT, and UpdateVisibilityOf().

Referenced by CinematicMgr::BeginCinematic(), CinematicMgr::EndCinematic(), AuraEffect::HandleBindSight(), WorldSession::HandleFarSightOpcode(), RemoveFromWorld(), and SetClientControl().

◆ SetVirtualItemSlot()

void Player::SetVirtualItemSlot ( uint8  i,
Item item 
)
Todo:
: this import is not necessary for compilation and marked as unused by the IDE
84{
85 ASSERT(i < 3);
86 if (i < 2 && item)
87 {
89 return;
91 if (charges == 0)
92 return;
93 if (charges > 1)
95 else if (charges <= 1)
96 {
99 }
100 }
101}

References ApplyEnchantment(), ASSERT, Item::ClearEnchantment(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Item::SetEnchantmentCharges(), and TEMP_ENCHANTMENT_SLOT.

Referenced by SetSheath().

◆ SetVisibleItemSlot()

void Player::SetVisibleItemSlot ( uint8  slot,
Item pItem 
)

◆ SetWaterWalking()

bool Player::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

movement counter

Reimplemented from Unit.

15913{
15914 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15915 if (!packetOnly /* && !Unit::SetWaterWalking(apply)*/)
15916 {
15917 Unit::SetWaterWalking(apply);
15918 // return false;
15919 }
15920
15922 data << GetPackGUID();
15923 data << uint32(0);
15924 SendDirectMessage(&data);
15925
15926 data.Initialize(MSG_MOVE_WATER_WALK, 64);
15927 data << GetPackGUID();
15928 BuildMovementPacket(&data);
15929 SendMessageToSet(&data, false);
15930 return true;
15931}
@ MSG_MOVE_WATER_WALK
Definition: Opcodes.h:719
virtual bool SetWaterWalking(bool enable, bool packetOnly=false)
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition: Unit.cpp:20532

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_WATER_WALK, SendDirectMessage(), SendMessageToSet(), Unit::SetWaterWalking(), SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), and ResurrectPlayer().

◆ setWeaponChangeTimer()

void Player::setWeaponChangeTimer ( uint32  time)
inline
1590{m_weaponChangeTimer = time;}

References m_weaponChangeTimer.

◆ SetWeeklyQuestStatus()

void Player::SetWeeklyQuestStatus ( uint32  quest_id)
12085{
12086 m_weeklyquests.insert(quest_id);
12087 m_WeeklyQuestChanged = true;
12088}

References m_WeeklyQuestChanged, and m_weeklyquests.

Referenced by RewardQuest().

◆ SpawnCorpseBones()

void Player::SpawnCorpseBones ( bool  triggerSave = true)
4629{
4631 if (GetMap()->ConvertCorpseToBones(GetGUID()))
4632 if (triggerSave && !GetSession()->PlayerLogoutWithSave()) // at logout we will already store the player
4633 {
4634 // prevent loading as ghost without corpse
4635 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4636
4637 // pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
4639 stmt->SetData(0, GetGUID().GetCounter());
4640 trans->Append(stmt);
4641
4642 _SaveAuras(trans, false);
4643
4644 CharacterDatabase.CommitTransaction(trans);
4645 }
4646}
@ CHAR_UPD_CHAR_REMOVE_GHOST
Definition: CharacterDatabase.h:426

References _corpseLocation, _SaveAuras(), CHAR_UPD_CHAR_REMOVE_GHOST, CharacterDatabase, Object::GetGUID(), WorldObject::GetMap(), GetSession(), PreparedStatementBase::SetData(), and WorldLocation::WorldRelocate().

Referenced by Battleground::_ProcessResurrect(), CreateCorpse(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ SplitItem()

void Player::SplitItem ( uint16  src,
uint16  dst,
uint32  count 
)

If trading

If current item is in trade window (only possible with packet spoofing - silent return)

3437{
3438 uint8 srcbag = src >> 8;
3439 uint8 srcslot = src & 255;
3440
3441 uint8 dstbag = dst >> 8;
3442 uint8 dstslot = dst & 255;
3443
3444 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3445 if (!pSrcItem)
3446 {
3447 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3448 return;
3449 }
3450
3451 if (pSrcItem->m_lootGenerated) // prevent split looting item (item
3452 {
3453 //best error message found for attempting to split while looting
3455 return;
3456 }
3457
3458 // not let split all items (can be only at cheating)
3459 if (pSrcItem->GetCount() == count)
3460 {
3462 return;
3463 }
3464
3465 // not let split more existed items (can be only at cheating)
3466 if (pSrcItem->GetCount() < count)
3467 {
3469 return;
3470 }
3471
3473 if (TradeData* tradeData = GetTradeData())
3474 {
3476 if (tradeData->GetTradeSlotForItem(pSrcItem->GetGUID()) != TRADE_SLOT_INVALID)
3477 return;
3478 }
3479
3480 LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = {}, slot = {}, item = {}, count = {}", dstbag, dstslot, pSrcItem->GetEntry(), count);
3481 Item* pNewItem = pSrcItem->CloneItem(count, this);
3482 if (!pNewItem)
3483 {
3484 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3485 return;
3486 }
3487
3488 if (IsInventoryPos(dst))
3489 {
3490 // change item amount before check (for unique max count check)
3491 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3492
3493 ItemPosCountVec dest;
3494 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pNewItem, false);
3495 if (msg != EQUIP_ERR_OK)
3496 {
3497 delete pNewItem;
3498 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3499 SendEquipError(msg, pSrcItem, nullptr);
3500 return;
3501 }
3502
3503 if (IsInWorld())
3504 pSrcItem->SendUpdateToPlayer(this);
3505 pSrcItem->SetState(ITEM_CHANGED, this);
3506 StoreItem(dest, pNewItem, true);
3507 }
3508 else if (IsBankPos(dst))
3509 {
3510 // change item amount before check (for unique max count check)
3511 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3512
3513 ItemPosCountVec dest;
3514 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pNewItem, false);
3515 if (msg != EQUIP_ERR_OK)
3516 {
3517 delete pNewItem;
3518 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3519 SendEquipError(msg, pSrcItem, nullptr);
3520 return;
3521 }
3522
3523 if (IsInWorld())
3524 pSrcItem->SendUpdateToPlayer(this);
3525 pSrcItem->SetState(ITEM_CHANGED, this);
3526 BankItem(dest, pNewItem, true);
3527 }
3528 else if (IsEquipmentPos(dst))
3529 {
3530 // change item amount before check (for unique max count check), provide space for splitted items
3531 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3532
3533 uint16 dest;
3534 InventoryResult msg = CanEquipItem(dstslot, dest, pNewItem, false);
3535 if (msg != EQUIP_ERR_OK)
3536 {
3537 delete pNewItem;
3538 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3539 SendEquipError(msg, pSrcItem, nullptr);
3540 return;
3541 }
3542
3543 if (IsInWorld())
3544 pSrcItem->SendUpdateToPlayer(this);
3545 pSrcItem->SetState(ITEM_CHANGED, this);
3546 EquipItem(dest, pNewItem, true);
3548 }
3549}
@ EQUIP_ERR_COULDNT_SPLIT_ITEMS
Definition: Item.h:74
@ EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT
Definition: Item.h:73
@ TRADE_SLOT_INVALID
Definition: TradeData.h:32
TradeData * GetTradeData() const
Definition: Player.h:1367
Definition: TradeData.h:36

References AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), Item::CloneItem(), EQUIP_ERR_COULDNT_SPLIT_ITEMS, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, EquipItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetTradeData(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), ITEM_CHANGED, LOG_DEBUG, Item::m_lootGenerated, SendEquipError(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), and TRADE_SLOT_INVALID.

Referenced by WorldSession::HandleSplitItemOpcode().

◆ StartTimedAchievement()

void Player::StartTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry,
uint32  timeLost = 0 
)
13869{
13870 m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
13871}
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: AchievementMgr.cpp:2183

References m_achievementMgr, and AchievementMgr::StartTimedAchievement().

Referenced by Spell::_cast(), AddQuest(), Spell::DoSpellHitOnUnit(), InstanceScript::DoStartTimedAchievement(), BattlegroundWS::EventPlayerClickedOnFlag(), and KilledMonsterCredit().

◆ StopCastingBindSight()

void Player::StopCastingBindSight ( Aura except = nullptr)
13104{
13105 if (WorldObject* target = GetViewpoint())
13106 {
13107 if (target->isType(TYPEMASK_UNIT))
13108 {
13109 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
13110 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
13111 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
13112 }
13113 }
13114}
@ SPELL_AURA_MOD_POSSESS_PET
Definition: SpellAuraDefines.h:191
@ SPELL_AURA_MOD_POSSESS
Definition: SpellAuraDefines.h:65
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References Object::GetGUID(), GetViewpoint(), SPELL_AURA_BIND_SIGHT, SPELL_AURA_MOD_POSSESS, SPELL_AURA_MOD_POSSESS_PET, and TYPEMASK_UNIT.

Referenced by ActivateTaxiPathTo(), misc_commandscript::HandleUnbindSightCommand(), RemoveFromWorld(), and Unit::SetCharmedBy().

◆ StopCastingCharm()

void Player::StopCastingCharm ( Aura except = nullptr)
9251{
9252 Unit* charm = GetCharm();
9253 if (!charm)
9254 {
9255 return;
9256 }
9257
9258 if (charm->GetTypeId() == TYPEID_UNIT)
9259 {
9261 {
9262 ((Puppet*)charm)->UnSummon();
9263 }
9264 else if (charm->IsVehicle())
9265 {
9266 ExitVehicle();
9267 }
9268 }
9269
9270 if (GetCharmGUID())
9271 {
9276 }
9277
9278 if (GetCharmGUID())
9279 {
9280 LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
9281
9282 if (charm->GetCharmerGUID())
9283 {
9284 LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
9285 ABORT();
9286 }
9287 else
9288 {
9289 SetCharm(charm, false);
9290 }
9291 }
9292}
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
@ UNIT_MASK_PUPPET
Definition: UnitDefines.h:141
#define ABORT
Definition: Errors.h:76
Definition: TemporarySummon.h:114
bool IsVehicle() const
Definition: Unit.h:757
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10811
ObjectGuid GetCharmGUID() const
Definition: Unit.h:1165

References ABORT, ObjectGuid::Empty, Unit::ExitVehicle(), Unit::GetCharm(), Unit::GetCharmerGUID(), Unit::GetCharmGUID(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::HasUnitTypeMask(), Unit::IsVehicle(), LOG_FATAL, Unit::RemoveAurasByType(), Unit::SetCharm(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, SPELL_AURA_MOD_POSSESS_PET, Object::ToCreature(), ObjectGuid::ToString(), Position::ToString(), TYPEID_UNIT, and UNIT_MASK_PUPPET.

Referenced by ActivateTaxiPathTo(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), Unit::RemoveAllControlled(), RemoveFromWorld(), Unit::SetCharmedBy(), and npc_chesspiece::sGossipSelect().

◆ StopMirrorTimer()

void Player::StopMirrorTimer ( MirrorTimerType  Type)
protected

◆ StopMirrorTimers()

◆ StoreItem()

Item * Player::StoreItem ( ItemPosCountVec const &  pos,
Item pItem,
bool  update 
)
2590{
2591 if (!pItem)
2592 return nullptr;
2593
2594 Item* lastItem = pItem;
2595 ItemTemplate const* proto = pItem->GetTemplate();
2596
2597 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();)
2598 {
2599 uint16 pos = itr->pos;
2600 uint32 count = itr->count;
2601
2602 ++itr;
2603
2604 if (itr == dest.end())
2605 {
2606 lastItem = _StoreItem(pos, pItem, count, false, update);
2607 break;
2608 }
2609
2610 lastItem = _StoreItem(pos, pItem, count, true, update);
2611 }
2612
2613 // cast after item storing - some checks in checkcast requires item to be present!!
2614 if (lastItem)
2615 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2616 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
2617 if (!HasAura(proto->Spells[i].SpellId))
2618 CastSpell(this, proto->Spells[i].SpellId, true, lastItem);
2619
2620 return lastItem;
2621}
Item * _StoreItem(uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
Definition: PlayerStorage.cpp:2624

References _StoreItem(), Unit::CastSpell(), Item::GetTemplate(), Unit::HasAura(), ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, and _Spell::SpellTrigger.

Referenced by _LoadInventory(), AutoUnequipOffhandIfNeed(), BankItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleMailCreateTextItem(), MoveItemToInventory(), SplitItem(), StoreNewItem(), and SwapItem().

◆ StoreLootItem()

LootItem * Player::StoreLootItem ( uint8  lootSlot,
Loot loot,
InventoryResult msg 
)
13464{
13465 QuestItem* qitem = nullptr;
13466 QuestItem* ffaitem = nullptr;
13467 QuestItem* conditem = nullptr;
13468
13469 msg = EQUIP_ERR_OK;
13470
13471 LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem);
13472 if (!item || item->is_looted)
13473 {
13474 if (!sScriptMgr->CanSendErrorAlreadyLooted(this))
13475 {
13476 SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr);
13477 }
13478 return nullptr;
13479 }
13480
13481 // Xinef: exploit protection, dont allow to loot normal items if player is not master loot and not below loot threshold
13482 // Xinef: only quest, ffa and conditioned items
13483 if (!item->is_underthreshold && loot->roundRobinPlayer && !GetLootGUID().IsItem() && GetGroup() && GetGroup()->GetLootMethod() == MASTER_LOOT && GetGUID() != GetGroup()->GetMasterLooterGuid())
13484 if (!qitem && !ffaitem && !conditem)
13485 {
13487 return nullptr;
13488 }
13489
13490 if (!item->AllowedForPlayer(this, loot->sourceWorldObjectGUID))
13491 {
13493 return nullptr;
13494 }
13495
13496 // questitems use the blocked field for other purposes
13497 if (!qitem && item->is_blocked)
13498 {
13500 return nullptr;
13501 }
13502
13503 // xinef: dont allow protected item to be looted by someone else
13504 if (item->rollWinnerGUID && item->rollWinnerGUID != GetGUID())
13505 {
13507 return nullptr;
13508 }
13509
13510 ItemPosCountVec dest;
13511 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
13512 if (msg == EQUIP_ERR_OK)
13513 {
13514 AllowedLooterSet looters = item->GetAllowedLooters();
13515 Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, looters);
13516
13517 if (qitem)
13518 {
13519 qitem->is_looted = true;
13520 //freeforall is 1 if everyone's supposed to get the quest item.
13521 if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
13522 SendNotifyLootItemRemoved(lootSlot);
13523 else
13524 loot->NotifyQuestItemRemoved(qitem->index);
13525 }
13526 else
13527 {
13528 if (ffaitem)
13529 {
13530 //freeforall case, notify only one player of the removal
13531 ffaitem->is_looted = true;
13532 SendNotifyLootItemRemoved(lootSlot);
13533 }
13534 else
13535 {
13536 //not freeforall, notify everyone
13537 if (conditem)
13538 conditem->is_looted = true;
13539 loot->NotifyItemRemoved(lootSlot);
13540 }
13541 }
13542
13543 //if only one person is supposed to loot the item, then set it to looted
13544 if (!item->freeforall)
13545 item->is_looted = true;
13546
13547 --loot->unlootedCount;
13548
13549 SendNewItem(newitem, uint32(item->count), false, false, true);
13550 UpdateLootAchievements(item, loot);
13551
13552 // LootItem is being removed (looted) from the container, delete it from the DB.
13553 if (loot->containerGUID)
13554 sLootItemStorage->RemoveStoredLootItem(loot->containerGUID, item->itemid, item->count, loot, item->itemIndex);
13555
13556 sScriptMgr->OnLootItem(this, newitem, item->count, this->GetLootGUID());
13557 }
13558 else
13559 {
13560 SendEquipError(msg, nullptr, nullptr, item->itemid);
13561 }
13562
13563 return item;
13564}
bool IsItem() const
Definition: Object.h:219
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition: PlayerUpdates.cpp:2117
void SendNotifyLootItemRemoved(uint8 lootSlot)
Definition: Player.cpp:8135
bool is_blocked
Definition: LootMgr.h:165
ObjectGuid rollWinnerGUID
Definition: LootMgr.h:162
bool is_underthreshold
Definition: LootMgr.h:167
bool AllowedForPlayer(Player const *player, ObjectGuid source) const
Definition: LootMgr.cpp:410
uint32 itemIndex
Definition: LootMgr.h:157
bool is_looted
Definition: LootMgr.h:164
const AllowedLooterSet & GetAllowedLooters() const
Definition: LootMgr.h:182
bool freeforall
Definition: LootMgr.h:166
Definition: LootMgr.h:186
uint8 index
Definition: LootMgr.h:187
bool is_looted
Definition: LootMgr.h:188
ObjectGuid sourceWorldObjectGUID
Definition: LootMgr.h:330
void NotifyQuestItemRemoved(uint8 questIndex)
Definition: LootMgr.cpp:795
QuestItemMap const & GetPlayerQuestItems() const
Definition: LootMgr.h:316
void NotifyItemRemoved(uint8 lootIndex)
Definition: LootMgr.cpp:764

References LootItem::AllowedForPlayer(), CanStoreNewItem(), Loot::containerGUID, LootItem::count, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_OK, LootItem::freeforall, LootItem::GetAllowedLooters(), GetGroup(), Object::GetGUID(), GetLootGUID(), Loot::GetPlayerQuestItems(), QuestItem::index, LootItem::is_blocked, LootItem::is_looted, QuestItem::is_looted, LootItem::is_underthreshold, Object::IsItem(), LootItem::itemid, LootItem::itemIndex, Loot::LootItemInSlot(), MASTER_LOOT, Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, LootItem::rollWinnerGUID, Loot::roundRobinPlayer, SendEquipError(), SendLootRelease(), SendNewItem(), SendNotifyLootItemRemoved(), sLootItemStorage, Loot::sourceWorldObjectGUID, sScriptMgr, StoreNewItem(), Loot::unlootedCount, and UpdateLootAchievements().

Referenced by Loot::FillNotNormalLootFor(), and WorldSession::HandleAutostoreLootItemOpcode().

◆ StoreNewItem() [1/2]

Item * Player::StoreNewItem ( ItemPosCountVec const &  pos,
uint32  item,
bool  update,
int32  randomPropertyId,
AllowedLooterSet allowedLooters 
)
2547{
2548 uint32 count = 0;
2549 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
2550 count += itr->count;
2551
2552 Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
2553 if (pItem)
2554 {
2555 // pussywizard: obtaining blue or better items saves to db
2556 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2557 if (pProto->Quality >= ITEM_QUALITY_RARE)
2559
2560 ItemAddedQuestCheck(item, count);
2563 pItem = StoreItem(dest, pItem, update);
2564
2565 if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
2566 {
2567 pItem->SetSoulboundTradeable(allowedLooters);
2569 AddTradeableItem(pItem);
2570
2571 // save data
2572 std::ostringstream ss;
2573 AllowedLooterSet::const_iterator itr = allowedLooters.begin();
2574 ss << (*itr).GetCounter();
2575 for (++itr; itr != allowedLooters.end(); ++itr)
2576 ss << ' ' << (*itr).GetCounter();
2577
2579 stmt->SetData(0, pItem->GetGUID().GetCounter());
2580 stmt->SetData(1, ss.str());
2581 CharacterDatabase.Execute(stmt);
2582 }
2583
2584 sScriptMgr->OnStoreNewItem(this, pItem, count);
2585 }
2586 return pItem;
2587}
@ ITEM_FIELD_CREATE_PLAYED_TIME
Definition: UpdateFields.h:71
@ CONFIG_SET_BOP_ITEM_TRADEABLE
Definition: IWorld.h:173
@ CHAR_INS_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition: DBCEnums.h:150

References ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), AddTradeableItem(), CHAR_INS_ITEM_BOP_TRADE, CharacterDatabase, CONFIG_SET_BOP_ITEM_TRADEABLE, Item::CreateItem(), ObjectGuid::GetCounter(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), GetTotalPlayedTime(), Item::IsSoulBound(), ITEM_FIELD_CREATE_PLAYED_TIME, ITEM_QUALITY_RARE, ItemAddedQuestCheck(), PreparedStatementBase::SetData(), Item::SetSoulboundTradeable(), Object::SetUInt32Value(), sObjectMgr, sScriptMgr, StoreItem(), sWorld, and UpdateAchievementCriteria().

◆ StoreNewItem() [2/2]

◆ StoreNewItemInBestSlots()

bool Player::StoreNewItemInBestSlots ( uint32  item_id,
uint32  item_count 
)
696{
697 LOG_DEBUG("entities.player.items", "STORAGE: Creating initial item, itemId = {}, count = {}", titem_id, titem_amount);
698
699 // attempt equip by one
700 while (titem_amount > 0)
701 {
702 uint16 eDest;
703 InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
704 if (msg != EQUIP_ERR_OK)
705 break;
706
707 EquipNewItem(eDest, titem_id, true);
709 --titem_amount;
710 }
711
712 if (titem_amount == 0)
713 return true; // equipped
714
715 // attempt store
716 ItemPosCountVec sDest;
717 // store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
718 InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
719 if (msg == EQUIP_ERR_OK)
720 {
721 StoreNewItem(sDest, titem_id, true);
722 return true; // stored
723 }
724
725 // item can't be added
726 LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(true), getClass(), msg);
727 return false;
728}

References AutoUnequipOffhandIfNeed(), CanEquipNewItem(), CanStoreNewItem(), EQUIP_ERR_OK, EquipNewItem(), Unit::getClass(), Unit::getRace(), INVENTORY_SLOT_BAG_0, LOG_DEBUG, LOG_ERROR, NULL_SLOT, and StoreNewItem().

Referenced by Create().

◆ StoreRaidMapDifficulty()

void Player::StoreRaidMapDifficulty ( )
inline

◆ SummonIfPossible()

void Player::SummonIfPossible ( bool  agree,
ObjectGuid  summoner_guid 
)
12371{
12372 if (!agree)
12373 {
12374 m_summon_expire = 0;
12375 return;
12376 }
12377
12378 // expire and auto declined
12379 if (m_summon_expire < GameTime::GetGameTime().count())
12380 return;
12381
12382 // drop flag at summon
12383 // this code can be reached only when GM is summoning player who carries flag, because player should be immune to summoning spells when he carries flag
12384 if (Battleground* bg = GetBattleground())
12385 bg->EventPlayerDroppedFlag(this);
12386
12387 m_summon_expire = 0;
12388
12390
12392}
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition: DBCEnums.h:220
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:248

References ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ObjectAccessor::FindPlayer(), GetBattleground(), GameTime::GetGameTime(), Position::GetOrientation(), m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, TeleportTo(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleSummonResponseOpcode().

◆ SummonPet()

Pet * Player::SummonPet ( uint32  entry,
float  x,
float  y,
float  z,
float  ang,
PetType  petType,
Milliseconds  duration = 0s,
uint32  healthPct = 0 
)
8886{
8887 PetStable& petStable = GetOrInitPetStable();
8888
8889 Pet* pet = new Pet(this, petType);
8890
8891 if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry, 0, false, healthPct))
8892 {
8893 // Remove Demonic Sacrifice auras (known pet)
8895 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8896 {
8897 if ((*itr)->GetMiscValue() == 2228)
8898 {
8899 RemoveAurasDueToSpell((*itr)->GetId());
8900 itr = auraClassScripts.begin();
8901 }
8902 else
8903 ++itr;
8904 }
8905
8906 if (duration > 0s)
8907 pet->SetDuration(duration);
8908
8909 // Generate a new name for the newly summoned ghoul
8910 if (pet->IsPetGhoul())
8911 {
8912 std::string new_name = sObjectMgr->GeneratePetNameLocale(entry, GetSession()->GetSessionDbLocaleIndex());
8913 if (!new_name.empty())
8914 pet->SetName(new_name);
8915 }
8916
8917 return nullptr;
8918 }
8919
8920 // petentry == 0 for hunter "call pet" (current pet summoned if any)
8921 if (!entry)
8922 {
8923 delete pet;
8924 return nullptr;
8925 }
8926
8927 pet->Relocate(x, y, z, ang);
8928 if (!pet->IsPositionValid())
8929 {
8930 LOG_ERROR("misc", "Player::SummonPet: Pet ({}, Entry: {}) not summoned. Suggested coordinates aren't valid (X: {} Y: {})", pet->GetGUID().ToString(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY());
8931 delete pet;
8932 return nullptr;
8933 }
8934
8935 Map* map = GetMap();
8936 uint32 pet_number = sObjectMgr->GeneratePetNumber();
8937 if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number))
8938 {
8939 LOG_ERROR("misc", "Player::SummonPet: No such creature entry {}", entry);
8940 delete pet;
8941 return nullptr;
8942 }
8943
8944 if (petType == SUMMON_PET && petStable.CurrentPet)
8946
8947 pet->SetCreatorGUID(GetGUID());
8948 pet->SetFaction(GetFaction());
8953
8954 SetMinion(pet, true);
8955
8956 if (petType == SUMMON_PET)
8957 {
8959 {
8960 pet->GetCharmInfo()->SetPetNumber(pet_number, true); // Show pet details tab (Shift+P) only for demons & undead
8961 }
8962 else
8963 {
8964 pet->GetCharmInfo()->SetPetNumber(pet_number, false);
8965 }
8966
8970 pet->SetFullHealth();
8972 pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped in this case
8973 }
8974
8975 map->AddToMap(pet->ToCreature(), true);
8976
8977 ASSERT(!petStable.CurrentPet && (petType != HUNTER_PET || !petStable.GetUnslottedHunterPet()));
8978 pet->FillPetInfo(&petStable.CurrentPet.emplace());
8979
8980 if (petType == SUMMON_PET)
8981 {
8982 pet->InitPetCreateSpells();
8983 pet->InitTalentForLevel();
8986
8987 // Remove Demonic Sacrifice auras (known pet)
8989 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8990 {
8991 if ((*itr)->GetMiscValue() == 2228)
8992 {
8993 RemoveAurasDueToSpell((*itr)->GetId());
8994 itr = auraClassScripts.begin();
8995 }
8996 else
8997 ++itr;
8998 }
8999 }
9000
9001 if (duration > 0s)
9002 pet->SetDuration(duration);
9003
9005 {
9008 }
9009
9010 return pet;
9011}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175
@ UNIT_FIELD_PETEXPERIENCE
Definition: UpdateFields.h:134
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
@ UNIT_FIELD_PETNEXTLEVELEXP
Definition: UpdateFields.h:135
@ SUMMON_PET
Definition: PetDefines.h:31
@ UNIT_NPC_FLAG_NONE
Definition: UnitDefines.h:293
@ CREATURE_TYPE_UNDEAD
Definition: SharedDefines.h:2633
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
uint32 type
Definition: CreatureData.h:225
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1021
void SetName(std::string const &newname)
Definition: Object.h:457
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2474
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
Definition: Pet.cpp:2318
void SetDuration(Milliseconds dur)
Definition: Pet.h:90
void InitPetCreateSpells()
Definition: Pet.cpp:2049
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15532
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:247
float GetHealthPct() const
Definition: Unit.h:790
void ReplaceAllNpcFlags(NPCFlags flags)
Definition: Unit.h:994
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:638

References Map::AddToMap(), ASSERT, Pet::Create(), CREATURE_TYPE_DEMON, CREATURE_TYPE_UNDEAD, PetStable::CurrentPet, CreatureTemplate::family, Pet::FillPetInfo(), WorldObject::FindMap(), Map::GenerateLowGuid(), Unit::GetAuraEffectsByType(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), Unit::GetFaction(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealthPct(), Unit::GetLevel(), WorldObject::GetMap(), Unit::GetMaxPower(), GetOrInitPetStable(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), GetSession(), PetStable::GetUnslottedHunterPet(), HUNTER_PET, Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Pet::InitTalentForLevel(), Minion::IsPetGhoul(), Position::IsPositionValid(), Pet::LoadPetFromDB(), LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_AS_CURRENT, PET_SAVE_NOT_IN_SLOT, PetSpellInitialize(), POWER_MANA, Position::Relocate(), Unit::RemoveAurasDueToSpell(), RemovePet(), Unit::ReplaceAllNpcFlags(), Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), Unit::SetCreatorGUID(), Pet::SetDuration(), Unit::SetFaction(), Unit::SetFullHealth(), Unit::SetMinion(), WorldObject::SetName(), CharmInfo::SetPetNumber(), Unit::SetPower(), Unit::setPowerType(), Unit::SetUInt32Value(), sObjectMgr, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SUMMON_PET, Object::ToCreature(), ObjectGuid::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_1, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FIELD_PETEXPERIENCE, UNIT_FIELD_PETNEXTLEVELEXP, and UNIT_NPC_FLAG_NONE.

Referenced by Spell::EffectResurrectPet(), and Spell::EffectSummonPet().

◆ SwapItem()

void Player::SwapItem ( uint16  src,
uint16  dst 
)
3552{
3553 uint8 srcbag = src >> 8;
3554 uint8 srcslot = src & 255;
3555
3556 uint8 dstbag = dst >> 8;
3557 uint8 dstslot = dst & 255;
3558
3559 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3560 Item* pDstItem = GetItemByPos(dstbag, dstslot);
3561
3562 if (!pSrcItem)
3563 return;
3564
3565 LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = {}, slot = {}, item = {}", dstbag, dstslot, pSrcItem->GetEntry());
3566
3567 if (!IsAlive())
3568 {
3569 SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem);
3570 return;
3571 }
3572
3573 // SRC checks
3574
3575 if (GetLootGUID() == pSrcItem->GetGUID()) // prevent swap looting item
3576 {
3577 //best error message found for attempting to swap while looting
3578 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, nullptr);
3579 return;
3580 }
3581
3582 // check unequip potability for equipped items and bank bags
3583 if (IsEquipmentPos(src) || IsBagPos(src))
3584 {
3585 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3586 InventoryResult msg = CanUnequipItem(src, !IsBagPos(src) || IsBagPos(dst) || (pDstItem && pDstItem->ToBag() && pDstItem->ToBag()->IsEmpty()));
3587 if (msg != EQUIP_ERR_OK)
3588 {
3589 SendEquipError(msg, pSrcItem, pDstItem);
3590 return;
3591 }
3592 }
3593
3594 // anti-wpe
3595 if (pSrcItem->IsBag() && pSrcItem->IsNotEmptyBag() && !IsBagPos(dst))
3596 {
3598 return;
3599 }
3600
3601 // prevent put equipped/bank bag in self
3602 if (IsBagPos(src) && srcslot == dstbag)
3603 {
3605 return;
3606 }
3607
3608 // prevent equipping bag in the same slot from its inside
3609 if (IsBagPos(dst) && srcbag == dstslot)
3610 {
3612 return;
3613 }
3614
3615 // DST checks
3616
3617 if (pDstItem)
3618 {
3619 // Xinef: Removed next loot generated check
3620 if (pDstItem->GetGUID() == GetLootGUID()) // prevent swap looting item
3621 {
3622 //best error message found for attempting to swap while looting
3623 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, nullptr);
3624 return;
3625 }
3626
3627 // check unequip potability for equipped items and bank bags
3628 if (IsEquipmentPos(dst) || IsBagPos(dst))
3629 {
3630 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3631 InventoryResult msg = CanUnequipItem(dst, !IsBagPos(dst) || IsBagPos(src) || (pSrcItem->ToBag() && pSrcItem->ToBag()->IsEmpty()));
3632 if (msg != EQUIP_ERR_OK)
3633 {
3634 SendEquipError(msg, pSrcItem, pDstItem);
3635 return;
3636 }
3637 }
3638 }
3639
3640 // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
3641 // or swap empty bag with another empty or not empty bag (with items exchange)
3642
3643 // Move case
3644 if (!pDstItem)
3645 {
3646 if (IsInventoryPos(dst))
3647 {
3648 ItemPosCountVec dest;
3649 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false);
3650 if (msg != EQUIP_ERR_OK)
3651 {
3652 SendEquipError(msg, pSrcItem, nullptr);
3653 return;
3654 }
3655
3656 RemoveItem(srcbag, srcslot, true);
3657 StoreItem(dest, pSrcItem, true);
3659 if (IsBankPos(src))
3660 ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3661 }
3662 else if (IsBankPos(dst))
3663 {
3664 ItemPosCountVec dest;
3665 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false);
3666 if (msg != EQUIP_ERR_OK)
3667 {
3668 SendEquipError(msg, pSrcItem, nullptr);
3669 return;
3670 }
3671
3672 RemoveItem(srcbag, srcslot, true);
3673 BankItem(dest, pSrcItem, true);
3675 ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3676 }
3677 else if (IsEquipmentPos(dst))
3678 {
3679 uint16 dest;
3680 InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false);
3681 if (msg != EQUIP_ERR_OK)
3682 {
3683 SendEquipError(msg, pSrcItem, nullptr);
3684 return;
3685 }
3686
3687 RemoveItem(srcbag, srcslot, true);
3688 EquipItem(dest, pSrcItem, true);
3690 }
3691
3692 return;
3693 }
3694
3695 // attempt merge to / fill target item
3696 if (!pSrcItem->IsBag() && !pDstItem->IsBag())
3697 {
3698 InventoryResult msg;
3699 ItemPosCountVec sDest;
3700 uint16 eDest = 0;
3701 if (IsInventoryPos(dst))
3702 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false);
3703 else if (IsBankPos(dst))
3704 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false);
3705 else if (IsEquipmentPos(dst))
3706 msg = CanEquipItem(dstslot, eDest, pSrcItem, false);
3707 else
3708 return;
3709
3710 // can be merge/fill
3711 if (msg == EQUIP_ERR_OK)
3712 {
3713 if (pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetTemplate()->GetMaxStackSize())
3714 {
3715 RemoveItem(srcbag, srcslot, true);
3716
3717 if (IsInventoryPos(dst))
3718 StoreItem(sDest, pSrcItem, true);
3719 else if (IsBankPos(dst))
3720 BankItem(sDest, pSrcItem, true);
3721 else if (IsEquipmentPos(dst))
3722 {
3723 EquipItem(eDest, pSrcItem, true);
3725 }
3726 }
3727 else
3728 {
3729 pSrcItem->SetCount(pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetTemplate()->GetMaxStackSize());
3730 pDstItem->SetCount(pSrcItem->GetTemplate()->GetMaxStackSize());
3731 pSrcItem->SetState(ITEM_CHANGED, this);
3732 pDstItem->SetState(ITEM_CHANGED, this);
3733 if (IsInWorld())
3734 {
3735 pSrcItem->SendUpdateToPlayer(this);
3736 pDstItem->SendUpdateToPlayer(this);
3737 }
3738 }
3739 SendRefundInfo(pDstItem);
3740 return;
3741 }
3742 }
3743
3744 // Remove item enchantments for now and restore it later
3745 // Needed for swap sanity checks
3746 ApplyEnchantment(pSrcItem, false);
3747 if (pDstItem)
3748 {
3749 ApplyEnchantment(pDstItem, false);
3750 }
3751
3752 // impossible merge/fill, do real swap
3754
3755 // check src->dest move possibility
3756 ItemPosCountVec sDest;
3757 uint16 eDest = 0;
3758 if (IsInventoryPos(dst))
3759 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, true);
3760 else if (IsBankPos(dst))
3761 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, true);
3762 else if (IsEquipmentPos(dst))
3763 {
3764 msg = CanEquipItem(dstslot, eDest, pSrcItem, true);
3765 if (msg == EQUIP_ERR_OK)
3766 msg = CanUnequipItem(eDest, true);
3767 }
3768
3769 if (msg != EQUIP_ERR_OK)
3770 {
3771 // Restore enchantments
3772 ApplyEnchantment(pSrcItem, true);
3773 if (pDstItem)
3774 {
3775 ApplyEnchantment(pDstItem, true);
3776 }
3777
3778 SendEquipError(msg, pSrcItem, pDstItem);
3779 return;
3780 }
3781
3782 // check dest->src move possibility
3783 ItemPosCountVec sDest2;
3784 uint16 eDest2 = 0;
3785 if (IsInventoryPos(src))
3786 msg = CanStoreItem(srcbag, srcslot, sDest2, pDstItem, true);
3787 else if (IsBankPos(src))
3788 msg = CanBankItem(srcbag, srcslot, sDest2, pDstItem, true);
3789 else if (IsEquipmentPos(src))
3790 {
3791 msg = CanEquipItem(srcslot, eDest2, pDstItem, true);
3792 if (msg == EQUIP_ERR_OK)
3793 msg = CanUnequipItem(eDest2, true);
3794 }
3795
3796 if (msg != EQUIP_ERR_OK)
3797 {
3798 // Restore enchantments
3799 ApplyEnchantment(pSrcItem, true);
3800 if (pDstItem)
3801 {
3802 ApplyEnchantment(pDstItem, true);
3803 }
3804
3805 SendEquipError(msg, pDstItem, pSrcItem);
3806 return;
3807 }
3808
3809 // Restore enchantments
3810 ApplyEnchantment(pSrcItem, true);
3811 if (pDstItem)
3812 {
3813 ApplyEnchantment(pDstItem, true);
3814 }
3815
3816 // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
3817 if (Bag* srcBag = pSrcItem->ToBag())
3818 {
3819 if (Bag* dstBag = pDstItem->ToBag())
3820 {
3821 Bag* emptyBag = nullptr;
3822 Bag* fullBag = nullptr;
3823 if (srcBag->IsEmpty() && !IsBagPos(src))
3824 {
3825 emptyBag = srcBag;
3826 fullBag = dstBag;
3827 }
3828 else if (dstBag->IsEmpty() && !IsBagPos(dst))
3829 {
3830 emptyBag = dstBag;
3831 fullBag = srcBag;
3832 }
3833
3834 // bag swap (with items exchange) case
3835 if (emptyBag && fullBag)
3836 {
3837 ItemTemplate const* emptyProto = emptyBag->GetTemplate();
3838
3839 uint32 count = 0;
3840
3841 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3842 {
3843 Item* bagItem = fullBag->GetItemByPos(i);
3844 if (!bagItem)
3845 continue;
3846
3847 ItemTemplate const* bagItemProto = bagItem->GetTemplate();
3848 if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto))
3849 {
3850 // one from items not go to empty target bag
3852 return;
3853 }
3854
3855 ++count;
3856 }
3857
3858 if (count > emptyBag->GetBagSize())
3859 {
3860 // too small targeted bag
3862 return;
3863 }
3864
3865 // Items swap
3866 count = 0; // will pos in new bag
3867 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3868 {
3869 Item* bagItem = fullBag->GetItemByPos(i);
3870 if (!bagItem)
3871 continue;
3872
3873 fullBag->RemoveItem(i, true);
3874 emptyBag->StoreItem(count, bagItem, true);
3875 bagItem->SetState(ITEM_CHANGED, this);
3876
3877 ++count;
3878 }
3879 }
3880 }
3881 }
3882
3883 // now do moves, remove...
3884 RemoveItem(dstbag, dstslot, false, true);
3885 RemoveItem(srcbag, srcslot, false, true);
3886
3887 // add to dest
3888 if (IsInventoryPos(dst))
3889 StoreItem(sDest, pSrcItem, true);
3890 else if (IsBankPos(dst))
3891 BankItem(sDest, pSrcItem, true);
3892 else if (IsEquipmentPos(dst))
3893 EquipItem(eDest, pSrcItem, true);
3894
3895 // add to src
3896 if (IsInventoryPos(src))
3897 StoreItem(sDest2, pDstItem, true);
3898 else if (IsBankPos(src))
3899 BankItem(sDest2, pDstItem, true);
3900 else if (IsEquipmentPos(src))
3901 EquipItem(eDest2, pDstItem, true);
3902
3903 // Xinef: Call this here after all needed items are equipped
3905
3906 // if player is moving bags and is looting an item inside this bag
3907 // release the loot
3908 if (GetLootGUID())
3909 {
3910 bool released = false;
3911 if (IsBagPos(src))
3912 {
3913 Bag* bag = pSrcItem->ToBag();
3914 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3915 {
3916 if (Item* bagItem = bag->GetItemByPos(i))
3917 {
3918 // Xinef: Removed next loot generated check
3919 if (bagItem->GetGUID() == GetLootGUID())
3920 {
3922 released = true; // so we don't need to look at dstBag
3923 break;
3924 }
3925 }
3926 }
3927 }
3928
3929 if (!released && IsBagPos(dst))
3930 {
3931 Bag* bag = pDstItem->ToBag();
3932 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3933 {
3934 if (Item* bagItem = bag->GetItemByPos(i))
3935 {
3936 // Xinef: Removed next loot generated check
3937 if (bagItem->GetGUID() == GetLootGUID())
3938 {
3940 released = true; // not realy needed here
3941 break;
3942 }
3943 }
3944 }
3945 }
3946 }
3947
3949}
bool IsEmpty() const
Definition: Bag.cpp:179
Item * GetItemByPos(uint8 slot) const
Definition: Bag.cpp:235
void RemoveItem(uint8 slot, bool update)
Definition: Bag.cpp:143
void SendRefundInfo(Item *item)
Definition: Player.cpp:15469

References ApplyEnchantment(), AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CanUnequipItem(), WorldSession::DoLootRelease(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, EquipItem(), Bag::GetBagSize(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Bag::GetItemByPos(), GetLootGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), Unit::IsAlive(), Item::IsBag(), IsBagPos(), IsBankPos(), Bag::IsEmpty(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), Item::IsNotEmptyBag(), ITEM_CHANGED, ItemAddedQuestCheck(), ItemCanGoIntoBag(), ItemRemovedQuestCheck(), LOG_DEBUG, m_session, RemoveItem(), Bag::RemoveItem(), RemoveItemDependentAurasAndCasts(), SendEquipError(), SendRefundInfo(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), Bag::StoreItem(), Item::ToBag(), and UpdateTitansGrip().

Referenced by WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleEquipmentSetUse(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSwapInvItemOpcode(), and WorldSession::HandleSwapItem().

◆ SwapQuestSlot()

void Player::SwapQuestSlot ( uint16  slot1,
uint16  slot2 
)
inline
1496 {
1497 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
1498 {
1501
1504 }
1505 }

References Object::GetUInt32Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and Unit::SetUInt32Value().

Referenced by WorldSession::HandleQuestLogSwapQuest().

◆ TakeQuestSourceItem()

bool Player::TakeQuestSourceItem ( uint32  questId,
bool  msg 
)
1358{
1359 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1360 if (quest)
1361 {
1362 uint32 srcItemId = quest->GetSrcItemId();
1363 ItemTemplate const* item = sObjectMgr->GetItemTemplate(srcItemId);
1364
1365 if (srcItemId > 0)
1366 {
1367 uint32 count = quest->GetSrcItemCount();
1368 if (count <= 0)
1369 count = 1;
1370
1371 // exist two cases when destroy source quest item not possible:
1372 // a) non un-equippable item (equipped non-empty bag, for example)
1373 // b) when quest is started from an item and item also is needed in
1374 // the end as RequiredItemId
1375 InventoryResult res = CanUnequipItems(srcItemId, count);
1376 if (res != EQUIP_ERR_OK)
1377 {
1378 if (msg)
1379 SendEquipError(res, nullptr, nullptr, srcItemId);
1380 return false;
1381 }
1382
1383 bool destroyItem = true;
1384 for (uint8 n = 0; n < QUEST_ITEM_OBJECTIVES_COUNT; ++n)
1385 if (item->StartQuest == questId && srcItemId == quest->RequiredItemId[n])
1386 destroyItem = false;
1387
1388 if (destroyItem)
1389 DestroyItemCount(srcItemId, count, true, true);
1390 }
1391 }
1392
1393 return true;
1394}
uint32 StartQuest
Definition: ItemTemplate.h:668
InventoryResult CanUnequipItems(uint32 item, uint32 count) const
Definition: PlayerStorage.cpp:296
uint32 GetSrcItemCount() const
Definition: QuestDef.h:258
uint32 GetSrcItemId() const
Definition: QuestDef.h:257

References CanUnequipItems(), DestroyItemCount(), EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), QUEST_ITEM_OBJECTIVES_COUNT, Quest::RequiredItemId, SendEquipError(), sObjectMgr, and ItemTemplate::StartQuest.

Referenced by Spell::EffectQuestClear(), and WorldSession::HandleQuestLogRemoveQuest().

◆ TalkedToCreature()

void Player::TalkedToCreature ( uint32  entry,
ObjectGuid  guid 
)
2107{
2108 uint16 addTalkCount = 1;
2109 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2110 {
2111 uint32 questid = GetQuestSlotQuestId(i);
2112 if (!questid)
2113 continue;
2114
2115 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2116 if (!qInfo)
2117 continue;
2118
2119 QuestStatusData& q_status = m_QuestStatus[questid];
2120
2121 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2122 {
2124 {
2125 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2126 {
2127 // skip Gameobject objectives
2128 if (qInfo->RequiredNpcOrGo[j] < 0)
2129 continue;
2130
2131 uint32 reqTarget = 0;
2132
2133 if (qInfo->RequiredNpcOrGo[j] > 0) // creature activate objectives
2134 // checked at quest_template loading
2135 reqTarget = qInfo->RequiredNpcOrGo[j];
2136 else
2137 continue;
2138
2139 if (reqTarget == entry)
2140 {
2141 uint32 reqTalkCount = qInfo->RequiredNpcOrGoCount[j];
2142 uint16 curTalkCount = q_status.CreatureOrGOCount[j];
2143 if (curTalkCount < reqTalkCount)
2144 {
2145 q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
2146
2147 m_QuestStatusSave[questid] = true;
2148
2149 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
2150 }
2151 if (CanCompleteQuest(questid))
2152 CompleteQuest(questid);
2153 else
2155
2156 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2157 continue;
2158 }
2159 }
2160 }
2161 }
2162 }
2163}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by npc_aged_dying_ancient_kodo::OnGossipHello(), brann_bronzebeard::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_razael_and_lyana::OnGossipSelect(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ TeamIdForRace()

TeamId Player::TeamIdForRace ( uint8  race)
static
5787{
5788 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race))
5789 {
5790 switch (rEntry->TeamID)
5791 {
5792 case 1:
5793 return TEAM_HORDE;
5794 case 7:
5795 return TEAM_ALLIANCE;
5796 }
5797 LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->TeamID);
5798 }
5799 else
5800 LOG_ERROR("entities.player", "Race ({}) not found in DBC: wrong DBC files?", uint32(race));
5801
5802 return TEAM_ALLIANCE;
5803}

References LOG_ERROR, sChrRacesStore, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by CharacterCache::GetCharacterTeamByGuid(), Unit::GetModelForForm(), GetTeamId(), WorldSession::HandleAddFriendOpcode(), WorldSession::HandleCalendarEventInvite(), WorldSession::HandleCharCreateOpcode(), WorldSession::HandleCharFactionOrRaceChangeCallback(), WorldSession::HandleSendMail(), misc_commandscript::HandleSkirmishCommand(), PlayerTaxi::InitTaxiNodesForLevel(), Channel::KickOrBan(), AchievementMgr::LoadFromDB(), and SetFactionForRace().

◆ TeleportTo() [1/2]

bool Player::TeleportTo ( uint32  mapid,
float  x,
float  y,
float  z,
float  orientation,
uint32  options = 0,
Unit target = nullptr,
bool  newInstance = false 
)
1330{
1331 if (!MapMgr::IsValidMapCoord(mapid, x, y, z, orientation))
1332 {
1333 LOG_ERROR("entities.player", "TeleportTo: invalid map ({}) or invalid coordinates (X: {}, Y: {}, Z: {}, O: {}) given when teleporting player ({}, name: {}, map: {}, X: {}, Y: {}, Z: {}, O: {}).",
1334 mapid, x, y, z, orientation, GetGUID().ToString(), GetName(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
1335 return false;
1336 }
1337
1339 {
1340 LOG_ERROR("entities.player", "Player ({}, name: {}) tried to enter a forbidden map {}", GetGUID().ToString(), GetName(), mapid);
1342 return false;
1343 }
1344
1345 // preparing unsummon pet if lost (we must get pet before teleportation or will not find it later)
1346 Pet* pet = GetPet();
1347
1348 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
1349
1350 // don't let enter battlegrounds without assigned battleground id (for example through areatrigger)...
1351 if (!InBattleground() && mEntry->IsBattlegroundOrArena())
1352 return false;
1353
1354 // pussywizard: arena spectator, prevent teleporting from arena to instance/etc
1355 if (GetMapId() != mapid && IsSpectator() && mEntry->Instanceable())
1356 {
1358 return false;
1359 }
1360
1361 // client without expansion support
1362 if (GetSession()->Expansion() < mEntry->Expansion())
1363 {
1364 LOG_DEBUG("maps", "Player {} using client without required expansion tried teleport to non accessible map {}", GetName(), mapid);
1365
1366 if (GetTransport())
1367 {
1369 m_transport = nullptr;
1372 RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
1373 }
1374
1376
1377 return false; // normal client can't teleport to this map...
1378 }
1379 else
1380 LOG_DEBUG("maps", "Player {} is being teleported to map {}", GetName(), mapid);
1381
1382 // xinef: do this here in case teleport failed in above checks
1383 if (!(options & TELE_TO_NOT_LEAVE_TAXI) && IsInFlight())
1384 {
1387 }
1388
1389 if (!(options & TELE_TO_NOT_LEAVE_VEHICLE) && m_vehicle)
1390 ExitVehicle();
1391
1392 // reset movement flags at teleport, because player will continue move with these flags after teleport
1394 DisableSpline();
1395
1396 // Xinef: Remove all movement imparing effects auras, skip small teleport like blink
1397 if (mapid != GetMapId() || GetDistance2d(x, y) > 100)
1398 {
1403 // remove auras that should be removed when being teleported
1405 }
1406
1407 if (m_transport)
1408 {
1409 if (options & TELE_TO_NOT_LEAVE_TRANSPORT)
1411 else
1412 {
1414 m_transport = nullptr;
1417 }
1418 }
1419
1420 // The player was ported to another map and loses the duel immediately.
1421 // We have to perform this check before the teleport, otherwise the
1422 // ObjectAccessor won't find the flag.
1425
1426 if (!sScriptMgr->OnBeforePlayerTeleport(this, mapid, x, y, z, orientation, options, target))
1427 return false;
1428
1429 if (GetMapId() == mapid && !newInstance)
1430 {
1431 //lets reset far teleport flag if it wasn't reset during chained teleports
1433
1434 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1435 //if teleport spell is casted in Unit::Update() func
1436 //then we need to delay it until update process will be finished
1437 if (MustDelayTeleport())
1438 {
1441 //lets save teleport destination for player
1442 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1443 teleportStore_options = options;
1444 return true;
1445 }
1446
1447 if (options & TELE_TO_WITH_PET)
1449
1450 if (!(options & TELE_TO_NOT_UNSUMMON_PET))
1451 {
1452 //same map, only remove pet if out of range for new position
1453 if (pet && !pet->IsWithinDist3d(x, y, z, GetMap()->GetVisibilityRange()))
1455 }
1456
1457 if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
1458 CombatStop();
1459
1460 // this will be used instead of the current location in SaveToDB
1461 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1463
1464 // code for finish transfer called in WorldSession::HandleMovementOpcodes()
1465 // at client packet MSG_MOVE_TELEPORT_ACK
1467 // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
1468 if (!GetSession()->PlayerLogout())
1469 {
1470 SetCanTeleport(true);
1471 Position oldPos = GetPosition();
1472 Relocate(x, y, z, orientation);
1474 SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
1475 }
1476 }
1477 else
1478 {
1480 {
1482 return false;
1483 }
1484
1485 // far teleport to another map
1486 Map* oldmap = IsInWorld() ? GetMap() : nullptr;
1487 // check if we can enter before stopping combat / removing pet / totems / interrupting spells
1488
1489 // Check enter rights before map getting to avoid creating instance copy for player
1490 // this check not dependent from map instance copy and same for all instance copies of selected map
1491 if (!(options & TELE_TO_GM_MODE) && sMapMgr->PlayerCannotEnter(mapid, this, false))
1492 return false;
1493
1494 // if PlayerCannotEnter -> CanEnter: checked above
1495 {
1496 //lets reset near teleport flag if it wasn't reset during chained teleports
1498
1499 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1500 //if teleport spell is casted in Unit::Update() func
1501 //then we need to delay it until update process will be finished
1502 if (MustDelayTeleport())
1503 {
1506 //lets save teleport destination for player
1507 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1508 teleportStore_options = options;
1509 return true;
1510 }
1511
1513
1514 CombatStop();
1515
1516 // remove arena spell coldowns/buffs now to also remove pet's cooldowns before it's temporarily unsummoned
1518 {
1519 // KEEP THIS ORDER!
1521 if (pet)
1522 pet->RemoveArenaAuras();
1523
1525 }
1526
1527 // remove pet on map change
1528 if (pet)
1530
1531 // remove all dyn objects
1533
1534 // stop spellcasting
1535 // not attempt interrupt teleportation spell at caster teleport
1536 if (!(options & TELE_TO_SPELL))
1537 if (IsNonMeleeSpellCast(true))
1539
1540 //remove auras before removing from map...
1542
1543 if (!GetSession()->PlayerLogout())
1544 {
1545 // send transfer packets
1546 WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
1547 data << uint32(mapid);
1548 if (m_transport)
1549 data << m_transport->GetEntry() << GetMapId();
1550
1551 GetSession()->SendPacket(&data);
1552 }
1553
1554 // remove from old map now
1555 if (oldmap)
1556 oldmap->RemovePlayerFromMap(this, false);
1557
1558 // xinef: do this before setting fall information!
1559 if (IsMounted() && (!GetMap()->GetEntry()->IsDungeon() && !GetMap()->GetEntry()->IsBattlegroundOrArena()) && !m_transport)
1560 {
1562 if (!auras.empty())
1563 {
1564 SetMountBlockId((*auras.begin())->GetId());
1566 }
1567 }
1568
1569 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1571 // if the player is saved before worldportack (at logout for example)
1572 // this will be used instead of the current location in SaveToDB
1573
1574 if (!GetSession()->PlayerLogout())
1575 {
1576 SetCanTeleport(true);
1577 WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
1578 data << uint32(mapid);
1579 if (m_transport)
1581 else
1583
1584 GetSession()->SendPacket(&data);
1586 }
1587
1588 // move packet sent by client always after far teleport
1589 // code for finish transfer to new map called in WorldSession::HandleMoveWorldportAckOpcode at client packet
1591 }
1592 }
1593 return true;
1594}
@ AURA_INTERRUPT_FLAG_TELEPORTED
Definition: SpellDefines.h:66
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:47
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:48
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ TELE_TO_WITH_PET
Definition: Player.h:827
@ TELE_TO_NOT_LEAVE_TAXI
Definition: Player.h:828
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:826
@ TELE_TO_SPELL
Definition: Player.h:825
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:823
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:824
@ TELE_TO_GM_MODE
Definition: Player.h:821
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:822
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition: Player.h:798
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
Definition: UnitDefines.h:393
@ CLASS_CONTEXT_TELEPORT
Definition: UnitDefines.h:207
@ SMSG_NEW_WORLD
Definition: Opcodes.h:92
@ SMSG_TRANSFER_PENDING
Definition: Opcodes.h:93
bool IsWithinDist3d(float x, float y, float z, float dist) const
Definition: Object.cpp:1295
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1263
Position GetPosition() const
Definition: Position.h:143
Position::PositionXYZOStreamer PositionXYZOStream()
Definition: Position.h:150
bool HasPendingSpectatorForBG(uint32 bgInstanceId) const
Definition: Player.h:2556
void SendTeleportAckPacket()
Definition: Player.cpp:1320
void SetSelection(ObjectGuid guid)
Used for serverside target changes, does not apply to players.
Definition: Player.cpp:11507
void SendSavedInstances()
Definition: PlayerStorage.cpp:6571
void SetSemaphoreTeleportNear(time_t tm)
Definition: Player.h:2069
void SetHasDelayedTeleport(bool setting)
Definition: Player.h:2910
void SetSemaphoreTeleportFar(time_t tm)
Definition: Player.h:2070
bool MustDelayTeleport() const
Definition: Player.h:2907
void CleanupAfterTaxiFlight()
Definition: Player.cpp:10383
void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns=false)
Definition: Player.cpp:3518
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
uint32 GetUnitMovementFlags() const
Definition: Unit.h:1618
Vehicle * m_vehicle
Definition: Unit.h:1877
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:19925
void SetUnitMovementFlags(uint32 f)
Definition: Unit.h:1619
void RemoveAllDynObjects()
Definition: Unit.cpp:6114
void RemoveArenaAuras()
Definition: Unit.cpp:5286
virtual void RemovePlayerFromMap(Player *, bool)
Definition: Map.cpp:911
bool IsBattleArena() const
Definition: DBCStructure.h:1356

References Unit::AddUnitMovementFlag(), AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TELEPORTED, AURA_INTERRUPT_FLAG_TURNING, CLASS_CONTEXT_TELEPORT, CLASS_DEATH_KNIGHT, CleanupAfterTaxiFlight(), Unit::CombatStop(), DISABLE_TYPE_MAP, Unit::DisableSpline(), duel, DUEL_FLED, DuelComplete(), ObjectGuid::Empty, Unit::ExitVehicle(), MapEntry::Expansion(), Unit::GetAuraEffectsByType(), GetBattlegroundId(), WorldObject::GetDistance2d(), Object::GetEntry(), Unit::GetGameObject(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetName(), Position::GetOrientation(), GetPet(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), WorldObject::GetTransport(), Unit::GetUnitMovementFlags(), WorldObject::GetVisibilityRange(), HasPendingSpectatorForBG(), HasSpell(), InBattleground(), MapEntry::Instanceable(), Unit::InterruptNonMeleeSpells(), MapEntry::IsBattleArena(), MapEntry::IsBattlegroundOrArena(), IsClass(), DisableMgr::IsDisabledFor(), IsGameMaster(), Unit::IsInFlight(), Object::IsInWorld(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), AccountMgr::IsPlayerAccount(), IsSpectator(), MapMgr::IsValidMapCoord(), WorldObject::IsWithinDist3d(), LOG_DEBUG, LOG_ERROR, WorldObject::m_movementInfo, WorldObject::m_transport, Unit::m_vehicle, MotionMaster::MovementExpired(), MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE, MOVEMENTFLAG_ONTRANSPORT, MustDelayTeleport(), PLAYER_DUEL_ARBITER, MovementInfo::TransportInfo::pos, Position::PositionXYZOStream(), Position::Relocate(), Unit::RemoveAllDynObjects(), Unit::RemoveArenaAuras(), RemoveArenaSpellCooldowns(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), Map::RemovePlayerFromMap(), RepopAtGraveyard(), MovementInfo::TransportInfo::Reset(), WorldSession::SendPacket(), SendSavedInstances(), SendTeleportAckPacket(), Unit::SendTeleportPacket(), SendTransferAborted(), SetCanTeleport(), SetFallInformation(), SetHasDelayedTeleport(), SetMountBlockId(), SetSelection(), SetSemaphoreTeleportFar(), SetSemaphoreTeleportNear(), Unit::SetUnitMovementFlags(), sMapMgr, sMapStore, SMSG_NEW_WORLD, SMSG_TRANSFER_PENDING, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_MOUNTED, sScriptMgr, TELE_TO_GM_MODE, TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TAXI, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, teleportStore_dest, teleportStore_options, Position::ToString(), TRANSFER_ABORT_INSUF_EXPAN_LVL, TRANSFER_ABORT_MAP_NOT_ALLOWED, TRANSFER_ABORT_UNIQUE_MESSAGE, MovementInfo::transport, and UnsummonPetTemporaryIfAny().

Referenced by ActivateTaxiPathTo(), BattlegroundSA::CaptureGraveyard(), BattlegroundSA::DefendersPortalTeleport(), MotionTransport::DelayedTeleportTransport(), BattlegroundIC::DoAction(), go_commandscript::DoTeleport(), Spell::EffectTeleportUnits(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleWorldTeleportOpcode(), Unit::NearTeleportTo(), npc_wg_spirit_guide::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), BattlefieldWG::OnPlayerJoinWar(), at_orb_of_command::OnTrigger(), at_icc_saurfang_portal::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), BfGraveyard::RelocateDeadPlayers(), Battleground::RelocateDeadPlayers(), Map::RemoveAllPlayers(), RepopAtGraveyard(), ResurectUsingRequestData(), WorldSession::SendSpiritResurrect(), BattlegroundMgr::SendToBattleground(), SummonIfPossible(), lfg::LFGMgr::TeleportPlayer(), GmTicket::TeleportTo(), TeleportTo(), BattlegroundSA::TeleportToEntrancePosition(), TeleportToEntryPoint(), Update(), and GameObject::Use().

◆ TeleportTo() [2/2]

bool Player::TeleportTo ( WorldLocation const &  loc,
uint32  options = 0,
Unit target = nullptr 
)
inline
1091 {
1092 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
1093 }

References WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and TeleportTo().

◆ TeleportToEntryPoint()

◆ TextEmote() [1/2]

void Player::TextEmote ( std::string_view  text,
WorldObject const *  = nullptr,
bool  = false 
)
overridevirtual

Outputs an universal text which is supposed to be an action.

Reimplemented from Unit.

9336{
9337 std::string _text(text);
9338
9339 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text))
9340 {
9341 return;
9342 }
9343
9344 sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
9345
9346 WorldPacket data;
9348
9349 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, false, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE), true);
9350}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE
Definition: IWorld.h:164
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition: IWorld.h:200
@ CHAT_MSG_EMOTE
Definition: SharedDefines.h:3162
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735

References ChatHandler::BuildChatPacket(), CHAT_MSG_EMOTE, CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, LANG_UNIVERSAL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ TextEmote() [2/2]

void Player::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
overridevirtual

Reimplemented from Unit.

9353{
9354 Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
9355}

References CHAT_MSG_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToggleAFK()

void Player::ToggleAFK ( )
1289{
1291
1292 // afk player not allowed in battleground
1293 if (!IsGameMaster() && isAFK() && InBattleground())
1295}
void ToggleFlag(uint16 index, uint32 flag)
Definition: Object.cpp:877
void LeaveBattleground(Battleground *bg=nullptr)
Definition: Player.cpp:11274

References InBattleground(), isAFK(), IsGameMaster(), LeaveBattleground(), PLAYER_FLAGS, PLAYER_FLAGS_AFK, and Object::ToggleFlag().

Referenced by Battleground::AddPlayer(), WorldSession::HandleMessagechatOpcode(), Battlefield::PlayerAcceptInviteToWar(), and Unit::SetCharmedBy().

◆ ToggleDND()

void Player::ToggleDND ( )

◆ ToggleInstantFlight()

void Player::ToggleInstantFlight ( )

References m_isInstantFlightOn.

Referenced by OnGossipSelect().

◆ ToggleMetaGemsActive()

void Player::ToggleMetaGemsActive ( uint8  exceptslot,
bool  apply 
)
11205{
11206 //cycle all equipped items
11207 for (int slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11208 {
11209 //enchants for the slot being socketed are handled by WorldSession::HandleSocketOpcode(WorldPacket& recvData)
11210 if (slot == exceptslot)
11211 continue;
11212
11213 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11214
11215 if (!pItem || !pItem->GetTemplate()->Socket[0].Color) //if item has no sockets or no item is equipped go to next item
11216 continue;
11217
11218 //cycle all (gem)enchants
11219 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11220 {
11221 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11222 if (!enchant_id) //if no enchant go to next enchant(slot)
11223 continue;
11224
11225 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11226 if (!enchantEntry)
11227 continue;
11228
11229 //only metagems to be (de)activated, so only enchants with condition
11230 uint32 condition = enchantEntry->EnchantmentCondition;
11231 if (condition)
11232 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), apply);
11233 }
11234 }
11235}

References ApplyEnchantment(), _Socket::Color, SpellItemEnchantmentEntry::EnchantmentCondition, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, ItemTemplate::Socket, and sSpellItemEnchantmentStore.

Referenced by WorldSession::HandleSocketOpcode().

◆ TradeCancel()

void Player::TradeCancel ( bool  sendback)
4104{
4105 if (m_trade)
4106 {
4107 Player* trader = m_trade->GetTrader();
4108
4109 // send yellow "Trade canceled" message to both traders
4110 if (sendback)
4112
4113 trader->GetSession()->SendCancelTrade();
4114
4115 // cleanup
4116 delete m_trade;
4117 m_trade = nullptr;
4118 delete trader->m_trade;
4119 trader->m_trade = nullptr;
4120 }
4121}
void SendCancelTrade()
Definition: TradeHandler.cpp:529

References GetSession(), TradeData::GetTrader(), m_trade, and WorldSession::SendCancelTrade().

Referenced by ActivateTaxiPathTo(), CleanupsBeforeDelete(), WorldSession::HandleCancelTradeOpcode(), and WorldSession::HandleSocketClosed().

◆ UninviteFromGroup()

void Player::UninviteFromGroup ( )
  • If the player is invited, remove him. If the group if then only 1 person, disband the group.
2316{
2317 Group* group = GetGroupInvite();
2318 if (!group)
2319 return;
2320
2321 group->RemoveInvite(this);
2322
2323 if (group->IsCreated())
2324 {
2325 if (group->GetMembersCount() <= 1) // group has just 1 member => disband
2326 {
2327 group->Disband(true);
2328 group = nullptr; // gets deleted in disband
2329 }
2330 }
2331 else
2332 {
2333 if (group->GetInviteeCount() <= 1)
2334 {
2335 group->RemoveAllInvites();
2336 delete group;
2337 group = nullptr;
2338 }
2339 }
2340}
Group * GetGroupInvite()
Definition: Player.h:2442
bool IsCreated() const
Definition: Group.cpp:2286
void RemoveAllInvites()
Definition: Group.cpp:363
void Disband(bool hideDestroy=false)
Definition: Group.cpp:755
void RemoveInvite(Player *player)
Definition: Group.cpp:353
uint32 GetInviteeCount() const
Definition: Group.h:246

References Group::Disband(), GetGroupInvite(), Group::GetInviteeCount(), Group::GetMembersCount(), Group::IsCreated(), Group::RemoveAllInvites(), and Group::RemoveInvite().

Referenced by WorldSession::HandleGroupDeclineOpcode(), and WorldSession::LogoutPlayer().

◆ UnsummonPetTemporaryIfAny()

void Player::UnsummonPetTemporaryIfAny ( )

◆ Update()

void Player::Update ( uint32  time)
overridevirtual
Todo:
add weapon, skill check

Reimplemented from WorldObject.

53{
54 if (!IsInWorld())
55 return;
56
57 sScriptMgr->OnBeforePlayerUpdate(this, p_time);
58
59 // undelivered mail
61 {
64
65 // It will be recalculate at mailbox open (for unReadMails important
66 // non-0 until mailbox open, it also will be recalculated)
67 m_nextMailDelivereTime = time_t(0);
68 }
69
70 // Update cinematic location, if 500ms have passed and we're doing a
71 // cinematic now.
74 {
77 }
78
79 // used to implement delayed far teleports
81 Unit::Update(p_time);
83
84 time_t now = GameTime::GetGameTime().count();
85
86 UpdatePvPFlag(now);
88
89 UpdateContestedPvP(p_time);
90
91 UpdateDuelFlag(now);
92
94
95 UpdateAfkReport(now);
96
97 // Xinef: update charm AI only if we are controlled by creature or
98 // non-posses player charm
100 {
101 m_charmUpdateTimer += p_time;
102 if (m_charmUpdateTimer >= 1000)
103 {
105 if (Unit* charmer = GetCharmer())
106 if (charmer->IsAlive())
108 }
109 }
110
111 time_t lastTick = m_Last_tick;
112 if (now > m_Last_tick)
113 {
114 // Update items that have just a limited lifetime
116
117 // check every minute, less chance to crash and wont break anything.
119
120 // Played time
121 uint32 elapsed = uint32(now - m_Last_tick);
122 m_Played_time[PLAYED_TIME_TOTAL] += elapsed; // Total played time
123 m_Played_time[PLAYED_TIME_LEVEL] += elapsed; // Level played time
124 GetSession()->SetTotalTime(GetSession()->GetTotalTime() + elapsed);
125 m_Last_tick = now;
126 }
127
128 // If mute expired, remove it from the DB
129 if (GetSession()->m_muteTime && GetSession()->m_muteTime < now)
130 {
131 GetSession()->m_muteTime = 0;
133 LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
134 stmt->SetData(0, 0); // Set the mute time to 0
135 stmt->SetData(1, "");
136 stmt->SetData(2, "");
137 stmt->SetData(3, GetSession()->GetAccountId());
138 LoginDatabase.Execute(stmt);
139 }
140
141 if (!m_timedquests.empty())
142 {
143 QuestSet::iterator iter = m_timedquests.begin();
144 while (iter != m_timedquests.end())
145 {
146 QuestStatusData& q_status = m_QuestStatus[*iter];
147 if (q_status.Timer <= p_time)
148 {
149 uint32 quest_id = *iter;
150 ++iter; // current iter will be removed in FailQuest
151 FailQuest(quest_id);
152 }
153 else
154 {
155 q_status.Timer -= p_time;
156 m_QuestStatusSave[*iter] = true;
157 ++iter;
158 }
159 }
160 }
161
163
165 {
166 if (Unit* victim = GetVictim())
167 {
168 // default combat reach 10
170
172 {
173 if (!IsWithinMeleeRange(victim))
174 {
176 if (m_swingErrorMsg != 1) // send single time (client auto repeat)
177 {
179 m_swingErrorMsg = 1;
180 }
181 }
182 // 120 degrees of radiant range
183 else if (!HasInArc(2 * M_PI / 3, victim))
184 {
186 if (m_swingErrorMsg != 2) // send single time (client auto repeat)
187 {
189 m_swingErrorMsg = 2;
190 }
191 }
192 else
193 {
194 m_swingErrorMsg = 0; // reset swing error state
195
196 // prevent base and off attack in same time, delay attack at
197 // 0.2 sec
198 if (haveOffhandWeapon())
201
202 // do attack
205 }
206 }
207
209 {
210 if (!IsWithinMeleeRange(victim))
212 else if (!HasInArc(2 * M_PI / 3, victim))
214 else
215 {
216 // prevent base and off attack in same time, delay attack at
217 // 0.2 sec
220
221 // do attack
224 }
225 }
226
227 /*Unit* owner = victim->GetOwner();
228 Unit* u = owner ? owner : victim;
229 if (u->IsPvP() && (!duel || duel->opponent != u))
230 {
231 UpdatePvP(true);
232 RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
233 }*/
234 }
235 }
236
238 {
239 if (now > lastTick && _restTime > 0) // freeze update
240 {
241 time_t currTime = GameTime::GetGameTime().count();
242 time_t timeDiff = currTime - _restTime;
243 if (timeDiff >= 10) // freeze update
244 {
245 _restTime = currTime;
246
247 float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME);
248 float extraPerSec =
249 ((float) GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) *
250 bubble;
251
252 // speed collect rest bonus (section/in hour)
253 SetRestBonus(GetRestBonus() + timeDiff * extraPerSec);
254 }
255 }
256 }
257
258 if (m_weaponChangeTimer > 0)
259 {
260 if (p_time >= m_weaponChangeTimer)
262 else
263 m_weaponChangeTimer -= p_time;
264 }
265
266 if (!IsPositionValid()) // pussywizard: will crash below at eg. GetZoneAndAreaId
267 {
268 LOG_INFO("misc", "Player::Update - invalid position ({0:.1f}, {0:.1f}, {0:.1f})! Map: {}, MapId: {}, {}",
270 GetSession()->KickPlayer("Invalid position");
271 return;
272 }
273
274 if (m_zoneUpdateTimer > 0)
275 {
276 if (p_time >= m_zoneUpdateTimer)
277 {
278 // On zone update tick check if we are still in an inn if we are
279 // supposed to be in one
281 {
282 AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(GetInnTriggerId());
283 if (!atEntry || !IsInAreaTriggerRadius(atEntry, 5.f))
284 {
286 }
287 }
288
289 uint32 newzone, newarea;
290 GetZoneAndAreaId(newzone, newarea);
291
292 if (m_zoneUpdateId != newzone)
293 UpdateZone(newzone, newarea); // also update area
294 else
295 {
296 // use area updates as well
297 // needed for free far all arenas for example
298 if (m_areaUpdateId != newarea)
299 UpdateArea(newarea);
300 }
301
303 }
304 else
305 m_zoneUpdateTimer -= p_time;
306 }
307
308 sScriptMgr->OnPlayerUpdate(this, p_time);
309
310 if (IsAlive())
311 {
312 m_regenTimer += p_time;
314 }
315
316 if (m_deathState == DeathState::JustDied)
317 KillPlayer();
318
319 if (m_nextSave)
320 {
321 if (p_time >= m_nextSave)
322 {
323 // m_nextSave reset in SaveToDB call
324 SaveToDB(false, false);
325 LOG_DEBUG("entities.player", "Player::Update: Player '{}' ({}) saved", GetName(), GetGUID().ToString());
326 }
327 else
328 {
329 m_nextSave -= p_time;
330 }
331 }
332
333 // Handle Water/drowning
334 HandleDrowning(p_time);
335
336 if (GetDrunkValue())
337 {
338 m_drunkTimer += p_time;
341 }
342
343 if (HasPendingBind())
344 {
345 if (_pendingBindTimer <= p_time)
346 {
347 // Player left the instance
350 SetPendingBind(0, 0);
351 }
352 else
353 _pendingBindTimer -= p_time;
354 }
355
356 // not auto-free ghost from body in instances
357 if (m_deathTimer > 0 && !GetMap()->Instanceable() &&
359 {
360 if (p_time >= m_deathTimer)
361 {
362 m_deathTimer = 0;
365 }
366 else
367 m_deathTimer -= p_time;
368 }
369
370 UpdateEnchantTime(p_time);
371 UpdateHomebindTime(p_time);
372
373 if (!_instanceResetTimes.empty())
374 {
375 for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin();
376 itr != _instanceResetTimes.end();)
377 {
378 if (itr->second < now)
379 _instanceResetTimes.erase(itr++);
380 else
381 ++itr;
382 }
383 }
384
385 // group update
387
388 Pet* pet = GetPet();
389 if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityRange()) &&
390 !pet->isPossessed())
391 // if (pet && !pet->IsWithinDistInMap(this,
392 // GetMap()->GetVisibilityDistance()) && (GetCharmGUID() &&
393 // (pet->GetGUID()
394 // != GetCharmGUID())))
396
397 // pussywizard:
398 if (m_hostileReferenceCheckTimer <= p_time)
399 {
401 if (!GetMap()->IsDungeon())
404 }
405 else
407
408 // we should execute delayed teleports only for alive(!) players
409 // because we don't want player's ghost teleported from graveyard
410 // xinef: so we store it to the end of the world and teleport out of the ass
411 // after resurrection?
412 if (HasDelayedTeleport() /* && IsAlive()*/)
413 {
416 }
417
419 {
421 UpdateObjectVisibility(true, true);
424 }
425}
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:67
constexpr auto CINEMATIC_UPDATEDIFF
Definition: CinematicMgr.h:24
constexpr auto ZONE_UPDATE_INTERVAL
Definition: PlayerUpdates.cpp:50
#define ATTACK_DISPLAY_DELAY
Definition: Unit.h:624
@ UNIT_STATE_CHARGING
Definition: UnitDefines.h:166
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:164
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:253
@ RATE_REST_INGAME
Definition: IWorld.h:502
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition: DatabaseEnv.cpp:22
@ LOGIN_UPD_MUTE_TIME
Definition: LoginDatabase.h:72
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
void UpdateTimedAchievements(uint32 timeDiff)
Definition: AchievementMgr.cpp:2161
void deleteReferencesOutOfRange(float range)
Definition: HostileRefMgr.cpp:199
void RemoveFromNotify(uint16 f)
Definition: Object.h:565
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:140
std::vector< FlyByCamera > const * m_cinematicCamera
Definition: CinematicMgr.h:54
uint32 m_cinematicDiff
Definition: CinematicMgr.h:50
uint32 m_lastCinematicCheck
Definition: CinematicMgr.h:51
uint32 m_activeCinematicCameraId
Definition: CinematicMgr.h:52
void UpdateCinematicLocation(uint32 diff)
Definition: CinematicMgr.cpp:92
void UpdateEnchantTime(uint32 time)
Definition: PlayerStorage.cpp:4177
uint32 GetInnTriggerId() const
Definition: Player.h:1199
void UpdateContestedPvP(uint32 currTime)
Definition: PlayerMisc.cpp:360
void SendAttackSwingBadFacingAttack()
Definition: PlayerMisc.cpp:146
void SendUpdateToOutOfRangeGroupMembers()
Definition: Player.cpp:11656
void KillPlayer()
Definition: Player.cpp:4492
void UpdateDuelFlag(time_t currTime)
Definition: PlayerMisc.cpp:423
bool HasRestFlag(RestFlag restFlag) const
Definition: Player.h:1196
bool HasDelayedTeleport() const
Definition: Player.h:2909
void SendAttackSwingNotInRange()
Definition: PlayerMisc.cpp:78
void UpdateSoulboundTradeItems()
Definition: PlayerStorage.cpp:4123
void RemoveRestFlag(RestFlag restFlag)
Definition: Player.cpp:16114
void CheckDuelDistance(time_t currTime)
Definition: Player.cpp:6325
void UpdatePvPFlag(time_t currTime)
Definition: PlayerMisc.cpp:372
void HandleSobering()
The player sobers by 1% every 9 seconds.
Definition: Player.cpp:950
void UpdateFFAPvPFlag(time_t currTime)
Definition: PlayerMisc.cpp:391
void BindToInstance()
Definition: PlayerStorage.cpp:6522
void FailQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:880
void HandleDrowning(uint32 time_diff)
Definition: Player.cpp:833
void UpdateCharmedAI()
Definition: PlayerUpdates.cpp:1904
void UpdateHomebindTime(uint32 time)
Definition: PlayerUpdates.cpp:1347
bool IsInAreaTriggerRadius(AreaTrigger const *trigger, float delta=0.f) const
Definition: Player.cpp:2182
void RegenerateAll()
Definition: Player.cpp:1751
void UpdateAfkReport(time_t currTime)
checks the 15 afk reports per 5 minutes limit
Definition: PlayerMisc.cpp:351
bool IsCharmed() const
Definition: Unit.h:1214
Unit * GetCharmer() const
Definition: Unit.cpp:10548
bool haveOffhandWeapon() const
Definition: Unit.cpp:522
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:680
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition: Unit.cpp:665
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:1756
bool isPossessed() const
Definition: Unit.h:1215
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2532
void Update(uint32 time) override
Definition: Unit.cpp:383
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:682
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:683
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:643
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:1754
Definition: ObjectMgr.h:421
void SetTotalTime(uint32 TotalTime)
Definition: WorldSession.h:375
void KickPlayer(bool setKicked=true)
Definition: WorldSession.h:400

References _cinematicMgr, _instanceResetTimes, _pendingBindId, _pendingBindTimer, _restTime, ATTACK_DISPLAY_DELAY, Unit::AttackerStateUpdate(), BASE_ATTACK, BindToInstance(), Unit::bRequestForcedVisibilityUpdate, BuildPlayerRepop(), CheckDuelDistance(), CINEMATIC_UPDATEDIFF, HostileRefMgr::deleteReferencesOutOfRange(), FailQuest(), WorldObject::FindMap(), Unit::getAttackTimer(), Unit::GetCharmer(), GetDrunkValue(), GameTime::GetGameTime(), Object::GetGUID(), Unit::getHostileRefMgr(), GetInnTriggerId(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), getMSTime(), GetMSTimeDiffToNow(), WorldObject::GetName(), GetPet(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetRestBonus(), GetSession(), Object::GetUInt32Value(), Unit::GetVictim(), WorldObject::GetVisibilityRange(), WorldObject::GetZoneAndAreaId(), HandleDrowning(), HandleSobering(), Unit::HasAuraType(), HasDelayedTeleport(), Position::HasInArc(), HasPendingBind(), HasPlayerFlag(), HasRestFlag(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::haveOffhandWeapon(), IN_MILLISECONDS, Unit::IsAlive(), Unit::isAttackReady(), IsBeingTeleported(), Unit::IsCharmed(), IsInAreaTriggerRadius(), Object::IsInWorld(), Position::IsPositionValid(), Unit::isPossessed(), WorldObject::IsWithinDistInMap(), Unit::IsWithinMeleeRange(), WorldSession::KickPlayer(), KillPlayer(), LOG_DEBUG, LOG_INFO, LOGIN_UPD_MUTE_TIME, LoginDatabase, m_achievementMgr, CinematicMgr::m_activeCinematicCameraId, m_areaUpdateId, m_charmUpdateTimer, CinematicMgr::m_cinematicCamera, CinematicMgr::m_cinematicDiff, Unit::m_deathState, m_deathTimer, Unit::m_delayed_unit_relocation_timer, m_drunkTimer, m_hostileReferenceCheckTimer, m_Last_tick, CinematicMgr::m_lastCinematicCheck, WorldSession::m_muteTime, m_nextMailDelivereTime, m_nextSave, m_Played_time, m_QuestStatus, m_QuestStatusSave, Unit::m_regenTimer, m_swingErrorMsg, m_timedquests, m_weaponChangeTimer, m_zoneUpdateId, m_zoneUpdateTimer, NOTIFY_VISIBILITY_CHANGED, OFF_ATTACK, PET_SAVE_NOT_IN_SLOT, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_FLAGS_RESTING, PLAYER_NEXT_LEVEL_XP, RATE_REST_INGAME, RegenerateAll(), WorldObject::RemoveFromNotify(), RemovePet(), RemoveRestFlag(), RepopAtGraveyard(), Unit::resetAttackTimer(), REST_FLAG_IN_TAVERN, SaveToDB(), SendAttackSwingBadFacingAttack(), SendAttackSwingNotInRange(), SendNewMail(), SendUpdateToOutOfRangeGroupMembers(), Unit::setAttackTimer(), PreparedStatementBase::SetData(), SetHasDelayedTeleport(), SetMustDelayTeleport(), SetPendingBind(), SetRestBonus(), WorldSession::SetTotalTime(), sObjectMgr, SPELL_AURA_PREVENT_RESURRECTION, sScriptMgr, sWorld, teleportStore_dest, teleportStore_options, TeleportTo(), QuestStatusData::Timer, Position::ToString(), UNIT_FLAG_POSSESSED, UNIT_STATE_CASTING, UNIT_STATE_CHARGING, UNIT_STATE_MELEE_ATTACKING, unReadMails, Unit::Update(), UpdateAfkReport(), UpdateArea(), UpdateCharmedAI(), CinematicMgr::UpdateCinematicLocation(), UpdateContestedPvP(), UpdateDuelFlag(), UpdateEnchantTime(), UpdateFFAPvPFlag(), UpdateHomebindTime(), UpdateItemDuration(), UpdateObjectVisibility(), UpdatePvPFlag(), UpdateSoulboundTradeItems(), AchievementMgr::UpdateTimedAchievements(), UpdateZone(), and ZONE_UPDATE_INTERVAL.

Referenced by Map::Update().

◆ UpdateAchievementCriteria()

void Player::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)
2131{
2132 m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2,
2133 unit);
2134}
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: AchievementMgr.cpp:795

References m_achievementMgr, and AchievementMgr::UpdateAchievementCriteria().

Referenced by _addSpell(), Spell::_cast(), KillRewarder::_RewardKillCredit(), ActivateTaxiPathTo(), CheckAreaExploreAndOutdoor(), Group::CountTheRoll(), Unit::DealDamage(), Spell::DoSpellHitOnUnit(), FlightPathMovementGenerator::DoUpdate(), InstanceScript::DoUpdateAchievementCriteria(), DuelComplete(), EnvironmentalDamage(), EquipItem(), EquipNewItem(), lfg::LFGMgr::FinishDungeon(), GiveLevel(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuyBankSlotOpcode(), HandleFall(), WorldSession::HandleGameobjectReportUse(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleQuestLogRemoveQuest(), reset_commandscript::HandleResetHonorCommand(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleTextEmoteOpcode(), Unit::Kill(), KilledMonsterCredit(), ArenaTeamMember::ModifyPersonalRating(), MoveItemToInventory(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), InstanceSaveMgr::PlayerBindToInstance(), QuickEquipItem(), resetTalents(), RewardHonor(), RewardQuest(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), setDeathState(), SetMoney(), ReputationMgr::SetOneFactionReputation(), SetSkill(), SetTitle(), StoreNewItem(), SummonIfPossible(), UpdateLootAchievements(), BattlegroundAB::UpdatePlayerScore(), BattlegroundAV::UpdatePlayerScore(), BattlegroundEY::UpdatePlayerScore(), BattlegroundIC::UpdatePlayerScore(), BattlegroundWS::UpdatePlayerScore(), UpdateSkill(), UpdateSkillPro(), and GameObject::Use().

◆ UpdateAfkReport()

void Player::UpdateAfkReport ( time_t  currTime)

checks the 15 afk reports per 5 minutes limit

352{
353 if (m_bgData.bgAfkReportedTimer <= currTime)
354 {
356 m_bgData.bgAfkReportedTimer = currTime + 5 * MINUTE;
357 }
358}
time_t bgAfkReportedTimer
Definition: Player.h:1043

References BGData::bgAfkReportedCount, BGData::bgAfkReportedTimer, m_bgData, and MINUTE.

Referenced by Update().

◆ UpdateAllCritPercentages()

void Player::UpdateAllCritPercentages ( )

◆ UpdateAllRatings()

void Player::UpdateAllRatings ( )
664{
665 for (int cr = 0; cr < MAX_COMBAT_RATING; ++cr)
667}
CombatRating
Definition: Unit.h:216

References MAX_COMBAT_RATING, and UpdateRating().

Referenced by UpdateAllStats().

◆ UpdateAllSpellCritChances()

void Player::UpdateAllSpellCritChances ( )
872{
873 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
875}
@ SPELL_SCHOOL_NORMAL
Definition: SharedDefines.h:283
void UpdateSpellCritChance(uint32 school)
Definition: StatSystem.cpp:822

References MAX_SPELL_SCHOOL, SPELL_SCHOOL_NORMAL, and UpdateSpellCritChance().

Referenced by AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleModSpellCritChance(), UpdateAllStats(), UpdateRating(), and UpdateStats().

◆ UpdateAllStats()

bool Player::UpdateAllStats ( )
overridevirtual

Implements Unit.

189{
190 for (int8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
191 {
192 float value = GetTotalStatValue(Stats(i));
193 SetStat(Stats(i), int32(value));
194 }
195
196 UpdateArmor();
197 // calls UpdateAttackPowerAndDamage() in UpdateArmor for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
200
201 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
203
215
216 return true;
217}
void UpdateAllSpellCritChances()
Definition: StatSystem.cpp:871
void UpdateArmor() override
Definition: StatSystem.cpp:252
void UpdateSpellDamageAndHealingBonus()
Definition: StatSystem.cpp:177
void UpdateMaxHealth() override
Definition: StatSystem.cpp:296
void UpdateAllRatings()
Definition: PlayerUpdates.cpp:663
void UpdateAllCritPercentages()
Definition: StatSystem.cpp:680
void UpdateDefenseBonusesMod()
Definition: StatSystem.cpp:609
virtual void UpdateAllResistances()
Definition: StatSystem.cpp:54
float GetTotalStatValue(Stats stat, float additionalValue=0.0f) const
Definition: Unit.cpp:15229

References BASE_ATTACK, CR_ARMOR_PENETRATION, Unit::GetTotalStatValue(), MAX_POWERS, MAX_STATS, OFF_ATTACK, POWER_MANA, RecalculateRating(), Unit::SetStat(), STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllRatings(), Unit::UpdateAllResistances(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDefenseBonusesMod(), UpdateExpertise(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

Referenced by _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), Create(), GiveLevel(), and LoadFromDB().

◆ UpdateArea()

void Player::UpdateArea ( uint32  newArea)
1171{
1172 // pussywizard: inform instance, needed for Icecrown Citadel
1173 if (InstanceScript* instance = GetInstanceScript())
1174 instance->OnPlayerAreaUpdate(this, m_areaUpdateId, newArea);
1175
1176 sScriptMgr->OnPlayerUpdateArea(this, m_areaUpdateId, newArea);
1177
1178 // FFA_PVP flags are area and not zone id dependent
1179 // so apply them accordingly
1180 m_areaUpdateId = newArea;
1181
1182 AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
1183 pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
1184 UpdateFFAPvPState(false);
1185
1186 UpdateAreaDependentAuras(newArea);
1187
1188 pvpInfo.IsInNoPvPArea = false;
1189 if (area && area->IsSanctuary())
1190 {
1192 pvpInfo.IsInNoPvPArea = true;
1194 }
1195 else
1197
1198 uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE)
1201 if (area && area->flags & areaRestFlag)
1203 else
1205}
@ REST_FLAG_IN_FACTION_AREA
Definition: Player.h:816
@ AREA_FLAG_ARENA
Definition: DBCEnums.h:241
@ AREA_FLAG_REST_ZONE_HORDE
Definition: DBCEnums.h:256
@ AREA_FLAG_REST_ZONE_ALLIANCE
Definition: DBCEnums.h:257
bool IsInNoPvPArea
‍Marks if player is in an area which forces PvP flag
Definition: Player.h:362
bool IsInFFAPvPArea
‍Marks if player is in a sanctuary or friendly capital city
Definition: Player.h:363
void UpdateFFAPvPState(bool reset=true)
Definition: PlayerUpdates.cpp:1407
bool IsSanctuary() const
Definition: DBCStructure.h:533

References AREA_FLAG_ARENA, AREA_FLAG_REST_ZONE_ALLIANCE, AREA_FLAG_REST_ZONE_HORDE, Unit::CombatStopWithPets(), AreaTableEntry::flags, WorldObject::GetInstanceScript(), GetTeamId(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_areaUpdateId, pvpInfo, Object::RemoveByteFlag(), RemoveRestFlag(), REST_FLAG_IN_FACTION_AREA, sAreaTableStore, Object::SetByteFlag(), SetRestFlag(), sScriptMgr, TEAM_ALLIANCE, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_BYTES_2, UpdateAreaDependentAuras(), and UpdateFFAPvPState().

Referenced by SetGameMaster(), Update(), and UpdateZone().

◆ UpdateAreaDependentAuras()

void Player::UpdateAreaDependentAuras ( uint32  area_id)
1818{
1819 // remove auras from spells with area limitations
1820 for (AuraMap::iterator iter = m_ownedAuras.begin();
1821 iter != m_ownedAuras.end();)
1822 {
1823 // use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or
1824 // instead UpdateZone in both cases m_zoneUpdateId up-to-date
1825 if (iter->second->GetSpellInfo()->CheckLocation(
1826 GetMapId(), m_zoneUpdateId, newArea, this, false) !=
1828 RemoveOwnedAura(iter);
1829 else
1830 ++iter;
1831 }
1832
1833 // Xinef: check controlled auras
1834 if (!m_Controlled.empty())
1835 for (ControlSet::iterator itr = m_Controlled.begin();
1836 itr != m_Controlled.end();)
1837 {
1838 Unit* controlled = *itr;
1839 ++itr;
1840 if (controlled && !controlled->IsPet())
1841 {
1842 Unit::AuraMap& tAuras = controlled->GetOwnedAuras();
1843 for (Unit::AuraMap::iterator auraIter = tAuras.begin();
1844 auraIter != tAuras.end();)
1845 {
1846 if (auraIter->second->GetSpellInfo()->CheckLocation(
1847 GetMapId(), m_zoneUpdateId, newArea, nullptr) !=
1849 controlled->RemoveOwnedAura(auraIter);
1850 else
1851 ++auraIter;
1852 }
1853 }
1854 }
1855
1856 // some auras applied at subzone enter
1857 SpellAreaForAreaMapBounds saBounds =
1858 sSpellMgr->GetSpellAreaForAreaMapBounds(newArea);
1859 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1860 itr != saBounds.second; ++itr)
1861 if (itr->second->autocast &&
1862 itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
1863 if (!HasAura(itr->second->spellId))
1864 CastSpell(this, itr->second->spellId, true);
1865
1866 if (newArea == 4273 && GetVehicle() && GetPositionX() > 400) // Ulduar
1867 {
1868 switch (GetVehicleBase()->GetEntry())
1869 {
1870 case 33062:
1871 case 33109:
1872 case 33060:
1873 GetVehicle()->Dismiss();
1874 break;
1875 }
1876 }
1877}
std::pair< SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator > SpellAreaForAreaMapBounds
Definition: SpellMgr.h:550
Unit * GetVehicleBase() const
Definition: Unit.cpp:18659
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:635
AuraMap & GetOwnedAuras()
Definition: Unit.h:1257
void Dismiss()
Definition: Vehicle.cpp:521

References Unit::CastSpell(), Vehicle::Dismiss(), Object::GetEntry(), WorldLocation::GetMapId(), Unit::GetOwnedAuras(), Position::GetPositionX(), Unit::GetVehicle(), Unit::GetVehicleBase(), Unit::HasAura(), Unit::IsPet(), Unit::m_Controlled, Unit::m_ownedAuras, m_zoneUpdateId, Unit::RemoveOwnedAura(), SPELL_CAST_OK, and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), and UpdateArea().

◆ UpdateArmor()

void Player::UpdateArmor ( )
overridevirtual

Implements Unit.

253{
254 UnitMods unitMod = UNIT_MOD_ARMOR;
255
256 float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
257 value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
258 value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
259 value += GetModifierValue(unitMod, TOTAL_VALUE);
260
261 //add dynamic flat mods
263 for (AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
264 {
265 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
266 value += CalculatePct(GetStat(Stats((*i)->GetMiscValueB())), (*i)->GetAmount());
267 }
268
269 value *= GetModifierValue(unitMod, TOTAL_PCT);
270
271 SetArmor(int32(value));
272
273 UpdateAttackPowerAndDamage(); // armor dependent auras update for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
274}
@ SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:245

References BASE_PCT, BASE_VALUE, CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetArmor(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_MASK_NORMAL, STAT_AGILITY, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, and UpdateAttackPowerAndDamage().

Referenced by UpdateAllStats(), UpdateResistances(), and UpdateStats().

◆ UpdateArmorPenetration()

void Player::UpdateArmorPenetration ( int32  amount)
848{
849 // Store Rating Value
851}

References CR_ARMOR_PENETRATION, PLAYER_FIELD_COMBAT_RATING_1, and Unit::SetUInt32Value().

Referenced by UpdateRating().

◆ UpdateAttackPowerAndDamage()

void Player::UpdateAttackPowerAndDamage ( bool  ranged = false)
overridevirtual

Implements Unit.

331{
332 float val2 = 0.0f;
333 float level = float(GetLevel());
334
335 sScriptMgr->OnBeforeUpdateAttackPowerAndDamage(this, level, val2, ranged);
336
338
342
343 if (ranged)
344 {
348
350 {
351 val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
352 }
354 {
355 val2 = level + GetStat(STAT_AGILITY) - 10.0f;
356 }
358 {
359 switch (GetShapeshiftForm())
360 {
361 case FORM_CAT:
362 case FORM_BEAR:
363 case FORM_DIREBEAR:
364 val2 = 0.0f;
365 break;
366 default:
367 val2 = GetStat(STAT_AGILITY) - 10.0f;
368 break;
369 }
370 }
371 else
372 {
373 val2 = GetStat(STAT_AGILITY) - 10.0f;
374 }
375 }
376 else
377 {
379 {
380 val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
381 }
383 {
384 val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
385 }
387 {
388 // Check if Predatory Strikes is skilled
389 float mLevelMult = 0.0f;
390 float weapon_bonus = 0.0f;
391 if (IsInFeralForm())
392 {
394 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
395 {
396 AuraEffect* aurEff = *itr;
397 if (aurEff->GetSpellInfo()->SpellIconID == 1563)
398 {
399 switch (aurEff->GetEffIndex())
400 {
401 case 0: // Predatory Strikes (effect 0)
402 mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
403 break;
404 case 1: // Predatory Strikes (effect 1)
405 if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
406 {
407 // also gains % attack power from equipped weapon
408 ItemTemplate const* proto = mainHand->GetTemplate();
409 if (!proto)
410 continue;
411
412 uint32 ap = proto->getFeralBonus();
413 // Get AP Bonuses from weapon
414 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
415 {
416 if (i >= proto->StatsCount)
417 break;
418
420 ap += proto->ItemStat[i].ItemStatValue;
421 }
422
423 // Get AP Bonuses from weapon spells
424 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
425 {
426 // no spell
427 if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
428 continue;
429
430 // check if it is valid spell
431 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
432 if (!spellproto)
433 continue;
434
435 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
436 if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
437 ap += spellproto->Effects[j].CalcValue();
438 }
439
440 weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
441 }
442 break;
443 default:
444 break;
445 }
446 }
447 }
448 }
449
450 switch (GetShapeshiftForm())
451 {
452 case FORM_CAT:
453 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
454 break;
455 case FORM_BEAR:
456 case FORM_DIREBEAR:
457 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
458 break;
459 case FORM_MOONKIN:
460 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
461 break;
462 default:
463 val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
464 break;
465 }
466 }
468 {
469 val2 = GetStat(STAT_STRENGTH) - 10.0f;
470 }
471 }
472
473 SetModifierValue(unitMod, BASE_VALUE, val2);
474
475 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
476 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
477
478 //add dynamic flat mods
479 if (ranged)
480 {
481 if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
482 {
484 for (AuraEffectList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
485 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
486 }
487 }
488 else
489 {
491 for (AuraEffectList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
492 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
493
495 for (AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
496 // always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
497 attPowerMod += int32(GetArmor() / (*iter)->GetAmount());
498 }
499
500 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
501
502 sScriptMgr->OnAfterUpdateAttackPowerAndDamage(this, level, base_attPower, attPowerMod, attPowerMultiplier, ranged);
503 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
504 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
505 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
506
507 //automatically update weapon damage after attack power modification
508 if (ranged)
509 {
511 }
512 else
513 {
515 if (CanDualWield() && haveOffhandWeapon()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
519 }
520}
@ SPELL_AURA_MOD_ATTACK_POWER
Definition: SpellAuraDefines.h:162
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:275
@ SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
Definition: SpellAuraDefines.h:348
@ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:331
@ FORM_MOONKIN
Definition: UnitDefines.h:98
int32 ItemStatValue
Definition: ItemTemplate.h:587
uint32 ItemStatType
Definition: ItemTemplate.h:586
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]
Definition: ItemTemplate.h:648
int32 getFeralBonus(int32 extraDPS=0) const
Definition: ItemTemplate.h:744
uint32 StatsCount
Definition: ItemTemplate.h:647
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition: Unit.h:1441
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64

References BASE_ATTACK, BASE_PCT, BASE_VALUE, CalculatePct(), Unit::CanDualWield(), CLASS_CONTEXT_STATS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CLASSMASK_WAND_USERS, SpellInfo::Effects, EQUIPMENT_SLOT_MAINHAND, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, AuraEffect::GetAmount(), Unit::GetArmor(), Unit::GetAuraEffectsByType(), Unit::getClassMask(), AuraEffect::GetEffIndex(), ItemTemplate::getFeralBonus(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Unit::GetStat(), Unit::haveOffhandWeapon(), IsClass(), Unit::IsInFeralForm(), ITEM_MOD_ATTACK_POWER, ITEM_SPELLTRIGGER_ON_EQUIP, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, m_baseFeralAP, m_items, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_SPELL_EFFECTS, OFF_ATTACK, RANGED_ATTACK, Object::SetFloatValue(), Object::SetInt32Value(), Unit::SetModifierValue(), SPELL_AURA_DUMMY, SPELL_AURA_MOD_ATTACK_POWER, SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SpellInfo::SpellIconID, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellMgr, STAT_AGILITY, STAT_STRENGTH, ItemTemplate::StatsCount, TOTAL_PCT, TOTAL_VALUE, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, Unit::UpdateDamagePhysical(), and UpdateSpellDamageAndHealingBonus().

Referenced by ApplyFeralAPBonus(), AuraEffect::HandleAuraModAttackPowerOfArmor(), AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent(), InitDataForForm(), UpdateAllStats(), UpdateArmor(), and UpdateStats().

◆ UpdateBlockPercentage()

void Player::UpdateBlockPercentage ( )
617{
618 // No block
619 float value = 0.0f;
620 if (CanBlock())
621 {
622 // Base value
623 value = 5.0f;
624 // Modify value from defense skill
625 value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
626 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
628 // Increase from rating
630
631 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
632 {
633 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) : value;
634 }
635
636 value = value < 0.0f ? 0.0f : value;
637 }
639}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
#define sConfigMgr
Definition: Config.h:74
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790
bool CanBlock() const
Definition: Player.h:2161
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3592

References CanBlock(), CR_BLOCK, Unit::GetDefenseSkillValue(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), Unit::GetTotalAuraModifier(), PLAYER_BLOCK_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), and SPELL_AURA_MOD_BLOCK_PERCENT.

Referenced by AuraEffect::HandleAuraModBlockPercent(), SetCanBlock(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdateCharmedAI()

void Player::UpdateCharmedAI ( )
private
1905{
1906 // Xinef: maybe passed as argument?
1907 Unit* charmer = GetCharmer();
1908 CharmInfo* charmInfo = GetCharmInfo();
1909
1910 // Xinef: needs more thinking, maybe kill player?
1911 if (!charmer || !charmInfo)
1912 return;
1913
1914 // Xinef: we should be killed if caster enters evade mode and charm is
1915 // infinite
1916 if (charmer->GetTypeId() == TYPEID_UNIT &&
1917 charmer->ToCreature()->IsInEvadeMode())
1918 {
1919 AuraEffectList const& auras =
1921 for (AuraEffectList::const_iterator iter = auras.begin();
1922 iter != auras.end(); ++iter)
1923 if ((*iter)->GetCasterGUID() == charmer->GetGUID() &&
1924 (*iter)->GetBase()->IsPermanent())
1925 {
1926 Unit::DealDamage(charmer, this, GetHealth(), nullptr,
1928 nullptr, false);
1929 return;
1930 }
1931 }
1932
1933 Unit* target = GetVictim();
1934 if (target)
1935 {
1936 SetInFront(target);
1938 }
1939
1941 return;
1942
1943 bool Mages =
1944 getClassMask() & (1 << (CLASS_MAGE - 1) | 1 << (CLASS_WARLOCK - 1) |
1945 1 << (CLASS_DRUID - 1) | 1 << (CLASS_HUNTER - 1) |
1946 1 << (CLASS_PRIEST - 1));
1947
1948 // Xinef: charmer type specific actions
1949 if (charmer->IsPlayer())
1950 {
1951 bool follow = false;
1952 if (!target)
1953 {
1954 if (charmInfo->GetPlayerReactState() == REACT_PASSIVE)
1955 follow = true;
1956 else if (charmInfo->GetPlayerReactState() == REACT_DEFENSIVE)
1957 {
1958 if (charmer->GetVictim())
1959 target = charmer->GetVictim();
1960 else
1961 follow = true;
1962 }
1963
1964 if (follow)
1965 {
1969 return;
1970 }
1971 }
1972 else if (target &&
1975 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
1976 }
1977
1978 if (!target || !IsValidAttackTarget(target))
1979 {
1980 target = SelectNearbyTarget(nullptr, GetMap()->IsDungeon() ? 100.f : 30.f);
1981 if (!target)
1982 {
1986
1987 return;
1988 }
1989
1990 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
1991 Attack(target, true);
1992 }
1993 else
1994 {
1995 float Distance = GetDistance(target);
1996 uint8 rnd = urand(0, 1);
1997
1998 if (Mages)
1999 {
2000 if ((GetPower(POWER_MANA) * 100 / GetMaxPower(POWER_MANA)) < 10)
2001 {
2002 GetMotionMaster()->MoveChase(target, 4);
2003 return;
2004 }
2005
2006 if (Distance <= 3)
2007 {
2008 if (urand(0, 1))
2009 {
2012 CastSpell(target, m_charmAISpells[SPELL_T_STUN], false);
2017 false);
2018 else if (m_charmAISpells[SPELL_IMMUNITY] &&
2021 }
2022 else
2023 {
2024 switch (urand(0, 1))
2025 {
2026 case 0:
2030 CastSpell(
2031 target,
2033 false);
2034 break;
2035 case 1:
2040 false);
2041 break;
2042 }
2043 }
2044 }
2045 else
2046 {
2047 switch (urand(0, 2))
2048 {
2049 case 0:
2053 CastSpell(target,
2055 false);
2056 break;
2057 case 1:
2061 CastSpell(target,
2063 false);
2064 break;
2065 case 2:
2069 false);
2070 break;
2071 }
2072 }
2073 }
2074 else
2075 {
2076 if (Distance > 10)
2077 {
2078 GetMotionMaster()->MoveChase(target, 2.0f);
2081 CastSpell(target, m_charmAISpells[SPELL_T_CHARGE], false);
2082 else if (m_charmAISpells[SPELL_FAST_RUN] &&
2085 }
2086
2088 return;
2089
2090 switch (urand(0, 2))
2091 {
2092 case 0:
2096 CastSpell(target,
2098 false);
2099 break;
2100 case 1:
2105 false);
2106 break;
2107 case 2:
2111 break;
2112 }
2113 }
2114 }
2115}
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:199
#define PET_FOLLOW_DIST
Definition: PetDefines.h:198
@ SPELL_HIGH_DAMAGE1
Definition: Player.h:918
@ REACT_DEFENSIVE
Definition: Unit.h:549
@ REACT_PASSIVE
Definition: Unit.h:548
@ UNIT_STATE_FOLLOW
Definition: UnitDefines.h:158
@ CHASE_MOTION_TYPE
Definition: MotionMaster.h:43
bool IsInEvadeMode() const
Definition: Creature.h:137
ReactStates GetPlayerReactState() const
Definition: CharmInfo.h:182
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition: Unit.cpp:16912
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10214
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16632
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13800
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20424
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:313
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:910
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:409

References Unit::Attack(), Unit::CastSpell(), CHASE_MOTION_TYPE, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PRIEST, CLASS_WARLOCK, Unit::DealDamage(), DIRECT_DAMAGE, Unit::GetAuraEffectsByType(), Unit::GetCharmer(), Unit::GetCharmInfo(), Unit::getClassMask(), MotionMaster::GetCurrentMovementGeneratorType(), WorldObject::GetDistance(), Object::GetGUID(), Unit::GetHealth(), WorldObject::GetMap(), Unit::GetMaxPower(), Unit::GetMotionMaster(), CharmInfo::GetPlayerReactState(), Unit::GetPower(), Object::GetTypeId(), Unit::GetVictim(), HasSpellCooldown(), Unit::HasUnitState(), Creature::IsInEvadeMode(), Object::IsPlayer(), Unit::IsValidAttackTarget(), m_charmAISpells, MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_ANGLE, PET_FOLLOW_DIST, POWER_MANA, REACT_DEFENSIVE, REACT_PASSIVE, Unit::SelectNearbyTarget(), Unit::SendMovementFlagUpdate(), Unit::SetInFront(), SPELL_AURA_MOD_CHARM, SPELL_DOT_DAMAGE, SPELL_FAST_RUN, SPELL_HIGH_DAMAGE1, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_ROOT_OR_FEAR, SPELL_SCHOOL_MASK_NORMAL, SPELL_T_CHARGE, SPELL_T_STUN, Object::ToCreature(), TYPEID_UNIT, UNIT_STATE_CASTING, UNIT_STATE_FOLLOW, and urand().

Referenced by Update().

◆ UpdateCombatSkills()

void Player::UpdateCombatSkills ( Unit victim,
WeaponAttackType  attType,
bool  defence,
Item item = nullptr 
)
981{
982 uint8 playerLevel = GetLevel();
983 uint16 currentSkillValue = defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType);
984 uint16 currentSkillMax = 5 * playerLevel;
985 int32 skillDiff = currentSkillMax - currentSkillValue;
986
987 // Max skill reached for level.
988 // Can in some cases be less than 0: having max skill and then .level -1 as example.
989 if (skillDiff <= 0)
990 {
991 return;
992 }
993
994 uint8 greylevel = Acore::XP::GetGrayLevel(playerLevel);
995 uint8 moblevel = defence ? victim->getLevelForTarget(this) : victim->GetLevel(); // if defense than victim == attacker
996 /*if (moblevel < greylevel)
997 return;*/
998 // Patch 3.0.8 (2009-01-20): You can no longer skill up weapons on mobs that are immune to damage.
999
1000 if (moblevel > playerLevel + 5)
1001 {
1002 moblevel = playerLevel + 5;
1003 }
1004
1005 int16 lvldif = moblevel - greylevel;
1006 if (lvldif < 3)
1007 {
1008 lvldif = 3;
1009 }
1010
1011 float chance = float(3 * lvldif * skillDiff) / playerLevel;
1012 if (!defence)
1013 {
1014 chance += chance * 0.02f * GetStat(STAT_INTELLECT);
1015 }
1016
1017 chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1%
1018
1019 LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance);
1020
1021 if (roll_chance_f(chance))
1022 {
1023 if (defence)
1024 {
1025 UpdateDefense();
1026 }
1027 else
1028 {
1029 UpdateWeaponSkill(victim, attType, item);
1030 }
1031 }
1032}
uint32 GetBaseDefenseSkillValue() const
Definition: Player.h:1911
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const
Definition: Player.cpp:12759
void UpdateDefense()
Definition: PlayerUpdates.cpp:564
void UpdateWeaponSkill(Unit *victim, WeaponAttackType attType, Item *item=nullptr)
Definition: PlayerUpdates.cpp:934
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:760

References GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Unit::getLevelForTarget(), Unit::GetStat(), LOG_DEBUG, roll_chance_f(), STAT_INTELLECT, UpdateDefense(), and UpdateWeaponSkill().

Referenced by Unit::ProcDamageAndSpellFor().

◆ UpdateContestedPvP()

void Player::UpdateContestedPvP ( uint32  currTime)
361{
363 return;
364 if (m_contestedPvPTimer <= diff)
365 {
367 }
368 else
369 m_contestedPvPTimer -= diff;
370}

References Unit::IsInCombat(), m_contestedPvPTimer, and ResetContestedPvP().

Referenced by Update().

◆ UpdateCorpseReclaimDelay()

void Player::UpdateCorpseReclaimDelay ( )
1880{
1882
1883 if ((pvp &&
1885 (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
1886 return;
1887
1888 time_t now = GameTime::GetGameTime().count();
1889
1890 if (now < m_deathExpireTime)
1891 {
1892 // full and partly periods 1..3
1893 uint64 count = (m_deathExpireTime - now) / DEATH_EXPIRE_STEP + 1;
1894
1895 if (count < MAX_DEATH_COUNT)
1896 m_deathExpireTime = now + (count + 1) * DEATH_EXPIRE_STEP;
1897 else
1899 }
1900 else
1902}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by KillPlayer().

◆ UpdateCraftSkill()

bool Player::UpdateCraftSkill ( uint32  spellid)
782{
783 LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid {}", spellid);
784
785 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid);
786
787 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first;
788 _spell_idx != bounds.second; ++_spell_idx)
789 {
790 if (_spell_idx->second->SkillLine)
791 {
792 uint32 SkillValue =
793 GetPureSkillValue(_spell_idx->second->SkillLine);
794
795 // Alchemy Discoveries here
796 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
797 if (spellInfo && spellInfo->Mechanic == MECHANIC_DISCOVERY)
798 {
799 if (uint32 discoveredSpell = GetSkillDiscoverySpell(
800 _spell_idx->second->SkillLine, spellid, this))
801 learnSpell(discoveredSpell);
802 }
803
804 uint32 craft_skill_gain =
805 sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING);
806 sScriptMgr->OnUpdateCraftingSkill(this, _spell_idx->second, SkillValue, craft_skill_gain);
807
808 return UpdateSkillPro(
809 _spell_idx->second->SkillLine,
810 SkillGainChance(SkillValue,
811 _spell_idx->second->TrivialSkillLineRankHigh,
812 (_spell_idx->second->TrivialSkillLineRankHigh +
813 _spell_idx->second->TrivialSkillLineRankLow) /
814 2,
815 _spell_idx->second->TrivialSkillLineRankLow),
816 craft_skill_gain);
817 }
818 }
819 return false;
820}
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player *player)
Definition: SkillDiscovery.cpp:213
int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel)
Definition: PlayerUpdates.cpp:707
@ CONFIG_SKILL_GAIN_CRAFTING
Definition: IWorld.h:275
@ MECHANIC_DISCOVERY
Definition: SharedDefines.h:1353
bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
Definition: PlayerUpdates.cpp:870
uint32 Mechanic
Definition: SpellInfo.h:323

References CONFIG_SKILL_GAIN_CRAFTING, GetPureSkillValue(), GetSkillDiscoverySpell(), learnSpell(), LOG_DEBUG, SpellInfo::Mechanic, MECHANIC_DISCOVERY, SkillGainChance(), sScriptMgr, sSpellMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::DoCreateItem(), Spell::EffectEnchantItemPerm(), and spell_gen_profession_research::HandleScript().

◆ UpdateCritPercentage()

void Player::UpdateCritPercentage ( WeaponAttackType  attType)
642{
643 BaseModGroup modGroup;
644 uint16 index;
645 CombatRating cr;
646
647 switch (attType)
648 {
649 case OFF_ATTACK:
650 modGroup = OFFHAND_CRIT_PERCENTAGE;
652 cr = CR_CRIT_MELEE;
653 break;
654 case RANGED_ATTACK:
655 modGroup = RANGED_CRIT_PERCENTAGE;
657 cr = CR_CRIT_RANGED;
658 break;
659 case BASE_ATTACK:
660 default:
661 modGroup = CRIT_PERCENTAGE;
663 cr = CR_CRIT_MELEE;
664 break;
665 }
666
667 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
668 // Modify crit from weapon skill and maximized defense skill of same level victim difference
669 value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
670
671 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
672 {
673 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) : value;
674 }
675
676 value = value < 0.0f ? 0.0f : value;
677 SetStatFloatValue(index, value);
678}
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition: Player.h:2172
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3757

References BASE_ATTACK, CR_CRIT_MELEE, CR_CRIT_RANGED, CRIT_PERCENTAGE, GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetTotalPercentageModValue(), Unit::GetWeaponSkillValue(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, sConfigMgr, and Object::SetStatFloatValue().

Referenced by HandleBaseModValue(), UpdateAllCritPercentages(), and UpdateRating().

◆ UpdateDefense()

void Player::UpdateDefense ( )
565{
567 sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE)))
568 UpdateDefenseBonusesMod(); // update dependent from defense skill part
569}
@ CONFIG_SKILL_GAIN_DEFENSE
Definition: IWorld.h:276
bool UpdateSkill(uint32 skill_id, uint32 step)
Definition: PlayerUpdates.cpp:670

References CONFIG_SKILL_GAIN_DEFENSE, SKILL_DEFENSE, sWorld, UpdateDefenseBonusesMod(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateDefenseBonusesMod()

void Player::UpdateDefenseBonusesMod ( )

◆ UpdateDodgePercentage()

void Player::UpdateDodgePercentage ( )
782{
783 const float dodge_cap[MAX_CLASSES] =
784 {
785 88.129021f, // Warrior
786 88.129021f, // Paladin
787 145.560408f, // Hunter
788 145.560408f, // Rogue
789 150.375940f, // Priest
790 88.129021f, // DK
791 145.560408f, // Shaman
792 150.375940f, // Mage
793 150.375940f, // Warlock
794 0.0f, // ??
795 116.890707f // Druid
796 };
797
798 float diminishing = 0.0f, nondiminishing = 0.0f;
799 GetDodgeFromAgility(diminishing, nondiminishing);
800 // Modify value from defense skill (only bonus from defense rating diminishes)
801 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
802 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
803 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
805 // Dodge from rating
806 diminishing += GetRatingBonusValue(CR_DODGE);
807 // apply diminishing formula to diminishing dodge chance
808 uint32 pclass = getClass() - 1;
809 m_realDodge = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
810
811 m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge;
812 float value = std::max(diminishing + nondiminishing, 0.0f);
813
814 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
815 {
816 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) : value;
817 }
818
820}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition: Player.cpp:5055

References CR_DEFENSE_SKILL, CR_DODGE, Unit::getClass(), GetDodgeFromAgility(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realDodge, MAX_CLASSES, PLAYER_DODGE_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_DODGE_PERCENT.

Referenced by AuraEffect::HandleAuraModDodgePercent(), UpdateDefenseBonusesMod(), UpdateRating(), and UpdateStats().

◆ UpdateDuelFlag()

void Player::UpdateDuelFlag ( time_t  currTime)
424{
425 if (duel && duel->State == DUEL_STATE_COUNTDOWN && duel->StartTime <= currTime)
426 {
427 sScriptMgr->OnPlayerDuelStart(this, duel->Opponent);
428
430 duel->Opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 2);
431
433 duel->Opponent->duel->State = DUEL_STATE_IN_PROGRESS;
434 }
435}
@ DUEL_STATE_COUNTDOWN
Definition: Player.h:371
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:372

References duel, DUEL_STATE_COUNTDOWN, DUEL_STATE_IN_PROGRESS, PLAYER_DUEL_TEAM, Unit::SetUInt32Value(), and sScriptMgr.

Referenced by Update().

◆ UpdateEnchantmentDurations()

void Player::UpdateEnchantmentDurations ( )
4750{
4751 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4752 {
4753 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4754 }
4755}

References m_enchantDuration.

Referenced by Spell::EffectSummonChangeItem().

◆ UpdateEnchantTime()

void Player::UpdateEnchantTime ( uint32  time)
4178{
4179 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4180 {
4181 ASSERT(itr->item);
4182 next = itr;
4183 if (!itr->item->GetEnchantmentId(itr->slot))
4184 {
4185 next = m_enchantDuration.erase(itr);
4186 }
4187 else if (itr->leftduration <= time)
4188 {
4189 ApplyEnchantment(itr->item, itr->slot, false, false);
4190 itr->item->ClearEnchantment(itr->slot);
4191 next = m_enchantDuration.erase(itr);
4192 }
4193 else if (itr->leftduration > time)
4194 {
4195 itr->leftduration -= time;
4196 ++next;
4197 }
4198 }
4199}

References ApplyEnchantment(), ASSERT, and m_enchantDuration.

Referenced by Update().

◆ UpdateEquipSpellsAtFormChange()

void Player::UpdateEquipSpellsAtFormChange ( )
1310{
1311 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
1312 {
1313 if (m_items[i] && !m_items[i]->IsBroken() &&
1315 {
1316 ApplyItemEquipSpell(m_items[i], false,
1317 true); // remove spells that not fit to form
1319 m_items[i], true,
1320 true); // add spells that fit form but not active
1321 }
1322 }
1323
1324 // item set bonuses not dependent from item broken state
1325 for (std::size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
1326 {
1327 ItemSetEffect* eff = ItemSetEff[setindex];
1328 if (!eff)
1329 continue;
1330
1331 for (uint32 y = 0; y < MAX_ITEM_SET_SPELLS; ++y)
1332 {
1333 SpellInfo const* spellInfo = eff->spells[y];
1334 if (!spellInfo)
1335 continue;
1336
1337 ApplyEquipSpell(spellInfo, nullptr, false,
1338 true); // remove spells that not fit to form
1339 if (!sScriptMgr->CanApplyEquipSpellsItemSet(this, eff))
1340 break;
1341 ApplyEquipSpell(spellInfo, nullptr, true,
1342 true); // add spells that fit form but not active
1343 }
1344 }
1345}
#define MAX_ITEM_SET_SPELLS
Definition: DBCStructure.h:1229
Definition: Item.h:32
SpellInfo const * spells[8]
Definition: Item.h:35

References ApplyEquipSpell(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), GetAttackBySlot(), INVENTORY_SLOT_BAG_END, ItemSetEff, m_items, MAX_ITEM_SET_SPELLS, ItemSetEffect::spells, and sScriptMgr.

Referenced by InitDataForForm().

◆ UpdateExpertise()

void Player::UpdateExpertise ( WeaponAttackType  attType)
878{
879 if (attack == RANGED_ATTACK)
880 return;
881
883
884 Item* weapon = GetWeaponForAttack(attack, true);
885
887 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
888 {
889 // item neutral spell
890 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
891 expertise += (*itr)->GetAmount();
892 // item dependent spell
893 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
894 expertise += (*itr)->GetAmount();
895 }
896
897 if (expertise < 0)
898 expertise = 0;
899
900 switch (attack)
901 {
902 case BASE_ATTACK:
904 break;
905 case OFF_ATTACK:
907 break;
908 default:
909 break;
910 }
911}
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303

References BASE_ATTACK, CR_EXPERTISE, Unit::GetAuraEffectsByType(), GetRatingBonusValue(), GetWeaponForAttack(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_EXPERTISE, PLAYER_OFFHAND_EXPERTISE, RANGED_ATTACK, Unit::SetUInt32Value(), and SPELL_AURA_MOD_EXPERTISE.

Referenced by DestroyItem(), EquipItem(), AuraEffect::HandleAuraModExpertise(), RemoveItem(), UpdateAllStats(), and UpdateRating().

◆ UpdateFallInformationIfNeed()

void Player::UpdateFallInformationIfNeed ( MovementInfo const &  minfo,
uint16  opcode 
)
2138{
2139 if (m_lastFallTime >= minfo.fallTime ||
2140 m_lastFallZ <= minfo.pos.GetPositionZ() || opcode == MSG_MOVE_FALL_LAND)
2141 SetFallInformation(minfo.fallTime, minfo.pos.GetPositionZ());
2142}
@ MSG_MOVE_FALL_LAND
Definition: Opcodes.h:231

References MovementInfo::fallTime, Position::GetPositionZ(), m_lastFallTime, m_lastFallZ, MSG_MOVE_FALL_LAND, MovementInfo::pos, and SetFallInformation().

Referenced by WorldSession::HandleMovementOpcodes().

◆ UpdateFFAPvPFlag()

void Player::UpdateFFAPvPFlag ( time_t  currTime)
392{
393 if (!IsFFAPvP() || sWorld->IsFFAPvPRealm() || !pvpInfo.FFAPvPEndTimer || currTime < pvpInfo.FFAPvPEndTimer + 30)
394 {
395 return;
396 }
397
398 pvpInfo.FFAPvPEndTimer = time_t(0);
400 {
402 sScriptMgr->OnFfaPvpStateUpdate(this, false);
403 }
404 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
405 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
406
407 // xinef: iterate attackers
408 AttackerSet toRemove;
409 AttackerSet const& attackers = getAttackers();
410 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end(); ++itr)
411 if (!(*itr)->IsValidAttackTarget(this))
412 toRemove.insert(*itr);
413
414 for (AttackerSet::const_iterator itr = toRemove.begin(); itr != toRemove.end(); ++itr)
415 (*itr)->AttackStop();
416
417 // xinef: remove our own victim
418 if (Unit* victim = GetVictim())
419 if (!IsValidAttackTarget(victim))
420 AttackStop();
421}
time_t FFAPvPEndTimer
‍Time when player unflags himself for PvP (flag removed after 5 minutes)
Definition: Player.h:365
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:632
AttackerSet const & getAttackers() const
Definition: Unit.h:724

References Unit::AttackStop(), PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by Update().

◆ UpdateFFAPvPState()

void Player::UpdateFFAPvPState ( bool  reset = true)
Todo:
: should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller
1408{
1410 // and controlled? no, we shouldn't, those are checked for affecting player
1411 // by client
1412 if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() &&
1413 (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm()))
1414 {
1415 if (!IsFFAPvP())
1416 {
1417 sScriptMgr->OnFfaPvpStateUpdate(this, true);
1419 for (ControlSet::iterator itr = m_Controlled.begin();
1420 itr != m_Controlled.end(); ++itr)
1421 (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1,
1423 }
1424
1426 {
1427 pvpInfo.FFAPvPEndTimer = time_t(0);
1428 }
1429 }
1430 else if (IsFFAPvP())
1431 {
1432 if ((pvpInfo.IsInNoPvPArea || IsGameMaster()) || reset ||
1434 {
1435 pvpInfo.FFAPvPEndTimer = time_t(0);
1437 {
1439 sScriptMgr->OnFfaPvpStateUpdate(this, false);
1440 }
1441 for (ControlSet::iterator itr = m_Controlled.begin();
1442 itr != m_Controlled.end(); ++itr)
1443 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1,
1445
1446 // xinef: iterate attackers
1447 AttackerSet toRemove;
1448 AttackerSet const& attackers = getAttackers();
1449 for (AttackerSet::const_iterator itr = attackers.begin();
1450 itr != attackers.end(); ++itr)
1451 if (!(*itr)->IsValidAttackTarget(this))
1452 toRemove.insert(*itr);
1453
1454 for (AttackerSet::const_iterator itr = toRemove.begin();
1455 itr != toRemove.end(); ++itr)
1456 (*itr)->AttackStop();
1457
1458 // xinef: remove our own victim
1459 if (Unit* victim = GetVictim())
1460 if (!IsValidAttackTarget(victim))
1461 AttackStop();
1462 }
1463 else
1464 {
1465 // Not in FFA PvP Area
1466 // Not FFA PvP realm
1467 // Not FFA PvP timer already set
1468 // Being recently in PvP combat
1469 if (!pvpInfo.IsInFFAPvPArea && !sWorld->IsFFAPvPRealm() &&
1471 {
1473 GameTime::GetGameTime().count() +
1474 sWorld->getIntConfig(CONFIG_FFA_PVP_TIMER);
1475 }
1476 }
1477 }
1478}
@ CONFIG_FFA_PVP_TIMER
Definition: IWorld.h:417
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition: Player.h:364

References Unit::AttackStop(), CONFIG_FFA_PVP_TIMER, PvPInfo::EndTimer, PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), GameTime::GetGameTime(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), IsGameMaster(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), Object::SetByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by UpdateArea(), and UpdatePvPState().

◆ UpdateFishingSkill()

bool Player::UpdateFishingSkill ( )
844{
845 LOG_DEBUG("entities.player.skills", "UpdateFishingSkill");
846
848
849 if (SkillValue >= GetMaxSkillValue(SKILL_FISHING))
850 {
851 return false;
852 }
853
854 /* Whenever the player clicks on the fishing gameobject the
855 * core will decide based on a probability if the skill raises or not.
856 */
857 return UpdateSkillPro(
859 static_cast<int32>(getProbabilityOfLevelUp(SkillValue)) * 10,
860 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING));
861}
float getProbabilityOfLevelUp(uint32 SkillValue)
Definition: PlayerUpdates.cpp:822
@ CONFIG_SKILL_GAIN_GATHERING
Definition: IWorld.h:277
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5410

References CONFIG_SKILL_GAIN_GATHERING, GetMaxSkillValue(), getProbabilityOfLevelUp(), GetPureSkillValue(), LOG_DEBUG, SKILL_FISHING, sWorld, and UpdateSkillPro().

Referenced by GameObject::Use().

◆ UpdateForQuestWorldObjects()

void Player::UpdateForQuestWorldObjects ( )

This code doesn't look right, but it was logically converted to condition system to do the exact same thing it did before. It definitely needs to be overlooked for intended functionality.

1743{
1744 if (m_clientGUIDs.empty())
1745 return;
1746
1747 UpdateData udata;
1748 WorldPacket packet;
1749 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
1750 {
1751 if ((*itr).IsGameObject())
1752 {
1753 if (GameObject* obj = ObjectAccessor::GetGameObject(*this, *itr))
1754 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1755 }
1756 else if ((*itr).IsCreatureOrVehicle())
1757 {
1759 if (!obj)
1760 continue;
1761
1762 // check if this unit requires quest specific flags
1764 {
1765 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(obj->GetEntry());
1766 for (SpellClickInfoContainer::const_iterator _itr = clickPair.first; _itr != clickPair.second; ++_itr)
1767 {
1770 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(obj->GetEntry(), _itr->second.spellId);
1771 bool buildUpdateBlock = false;
1772 for (ConditionList::const_iterator jtr = conds.begin(); jtr != conds.end() && !buildUpdateBlock; ++jtr)
1773 if ((*jtr)->ConditionType == CONDITION_QUESTREWARDED || (*jtr)->ConditionType == CONDITION_QUESTTAKEN)
1774 buildUpdateBlock = true;
1775
1776 if (buildUpdateBlock)
1777 {
1778 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1779 break;
1780 }
1781 }
1782 }
1784 {
1785 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1786 }
1787 }
1788 }
1789
1790 udata.BuildPacket(packet);
1791 GetSession()->SendPacket(&packet);
1792}
@ UNIT_NPC_FLAG_VENDOR_MASK
Definition: UnitDefines.h:322
@ CONDITION_QUESTREWARDED
Definition: ConditionMgr.h:43
@ CONDITION_QUESTTAKEN
Definition: ConditionMgr.h:44
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:187
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:257
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), CONDITION_QUESTREWARDED, CONDITION_QUESTTAKEN, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), ObjectAccessor::GetGameObject(), GetSession(), Unit::HasNpcFlag(), m_clientGUIDs, sConditionMgr, WorldSession::SendPacket(), sObjectMgr, UNIT_NPC_FLAG_SPELLCLICK, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_VENDOR_MASK.

Referenced by Group::AddMember(), Group::Disband(), EquipItem(), ItemAddedQuestCheck(), ItemRemovedQuestCheck(), Group::RemoveMember(), and SendQuestUpdate().

◆ UpdateGatherSkill()

bool Player::UpdateGatherSkill ( uint32  SkillId,
uint32  SkillValue,
uint32  RedLevel,
uint32  Multiplicator = 1 
)
721{
722 LOG_DEBUG("entities.player.skills",
723 "UpdateGatherSkill(SkillId {} SkillLevel {} RedLevel {})",
724 SkillId, SkillValue, RedLevel);
725
726 uint32 gathering_skill_gain =
727 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
728 sScriptMgr->OnUpdateGatheringSkill(this, SkillId, SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25, gathering_skill_gain);
729
730 // For skinning and Mining chance decrease with level. 1-74 - no decrease,
731 // 75-149 - 2 times, 225-299 - 8 times
732 switch (SkillId)
733 {
734 case SKILL_HERBALISM:
738 return UpdateSkillPro(SkillId,
739 SkillGainChance(SkillValue, RedLevel + 100,
740 RedLevel + 50, RedLevel + 25) *
741 Multiplicator,
742 gathering_skill_gain);
743 case SKILL_SKINNING:
744 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
745 return UpdateSkillPro(SkillId,
746 SkillGainChance(SkillValue, RedLevel + 100,
747 RedLevel + 50,
748 RedLevel + 25) *
749 Multiplicator,
750 gathering_skill_gain);
751 else
752 return UpdateSkillPro(
753 SkillId,
754 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
755 RedLevel + 25) *
756 Multiplicator) >>
757 (SkillValue /
759 gathering_skill_gain);
760 case SKILL_MINING:
761 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
762 return UpdateSkillPro(SkillId,
763 SkillGainChance(SkillValue, RedLevel + 100,
764 RedLevel + 50,
765 RedLevel + 25) *
766 Multiplicator,
767 gathering_skill_gain);
768 else
769 return UpdateSkillPro(
770 SkillId,
771 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
772 RedLevel + 25) *
773 Multiplicator) >>
774 (SkillValue /
776 gathering_skill_gain);
777 }
778 return false;
779}
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition: IWorld.h:274
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition: IWorld.h:273
@ SKILL_INSCRIPTION
Definition: SharedDefines.h:3002
@ SKILL_MINING
Definition: SharedDefines.h:2919
@ SKILL_SKINNING
Definition: SharedDefines.h:2961
@ SKILL_JEWELCRAFTING
Definition: SharedDefines.h:2985
@ SKILL_HERBALISM
Definition: SharedDefines.h:2915

References CONFIG_SKILL_CHANCE_MINING_STEPS, CONFIG_SKILL_CHANCE_SKINNING_STEPS, CONFIG_SKILL_GAIN_GATHERING, LOG_DEBUG, SKILL_HERBALISM, SKILL_INSCRIPTION, SKILL_JEWELCRAFTING, SKILL_LOCKPICKING, SKILL_MINING, SKILL_SKINNING, SkillGainChance(), sScriptMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::EffectMilling(), Spell::EffectOpenLock(), Spell::EffectProspecting(), Spell::EffectSkinning(), and GetExplicitDiscoverySpell().

◆ UpdateHomebindTime()

void Player::UpdateHomebindTime ( uint32  time)
1348{
1349 // GMs never get homebind timer online
1351 {
1352 if (m_HomebindTimer) // instance valid, but timer not reset
1353 {
1354 // hide reminder
1355 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1356 data << uint32(0);
1357 data << uint32(0);
1358 GetSession()->SendPacket(&data);
1359 }
1360 // instance is valid, reset homebind timer
1361 m_HomebindTimer = 0;
1362 }
1363 else if (m_HomebindTimer > 0)
1364 {
1365 if (time >= m_HomebindTimer)
1366 {
1367 // teleport to nearest graveyard
1369 }
1370 else
1371 m_HomebindTimer -= time;
1372 }
1373 else
1374 {
1375 // instance is invalid, start homebind timer
1376 m_HomebindTimer = 60000;
1377 // send message to player
1378 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1379 data << uint32(m_HomebindTimer);
1380 data << uint32(1);
1381 GetSession()->SendPacket(&data);
1382 LOG_DEBUG(
1383 "maps",
1384 "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 "
1385 "seconds",
1386 GetName(), GetGUID().ToString());
1387 }
1388}
@ SMSG_RAID_GROUP_ONLY
Definition: Opcodes.h:676

References Object::GetGUID(), WorldObject::GetName(), GetSession(), IsGameMaster(), LOG_DEBUG, m_HomebindTimer, m_InstanceValid, RepopAtGraveyard(), WorldSession::SendPacket(), SMSG_RAID_GROUP_ONLY, and Position::ToString().

Referenced by Update().

◆ UpdateHonorFields()

void Player::UpdateHonorFields ( )

called when rewarding honor and at each save

1138{
1140 time_t now = time_t(GameTime::GetGameTime().count());
1141 time_t today = time_t(GameTime::GetGameTime().count() / DAY) * DAY;
1142
1143 if (m_lastHonorUpdateTime < today)
1144 {
1145 time_t yesterday = today - DAY;
1146
1148
1149 // update yesterday's contribution
1150 if (m_lastHonorUpdateTime >= yesterday)
1151 {
1154
1155 // this is the first update today, reset today's contribution
1158 }
1159 else
1160 {
1161 // no honor/kills yesterday or today, reset
1164 }
1165 }
1166
1168}
uint16 PAIR32_LOPART(uint32 x)
Definition: ObjectDefines.h:97

References DAY, GameTime::GetGameTime(), Object::GetUInt32Value(), m_lastHonorUpdateTime, MAKE_PAIR32(), PAIR32_LOPART(), PLAYER_FIELD_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, and Unit::SetUInt32Value().

Referenced by honor_commandscript::HandleHonorUpdateCommand(), LoadFromDB(), RewardHonor(), and SaveToDB().

◆ UpdateInvisibilityDrunkDetect()

void Player::UpdateInvisibilityDrunkDetect ( )
996{
997 // select drunk percent or total SPELL_AURA_MOD_FAKE_INEBRIATE amount, whichever is higher for visibility updates
998 uint8 drunkValue = GetDrunkValue();
999 int32 fakeDrunkValue = GetFakeDrunkValue();
1000 int32 maxDrunkValue = std::max<int32>(drunkValue, fakeDrunkValue);
1001
1002 if (maxDrunkValue != 0)
1003 {
1006 }
1007 else
1009
1011}
@ INVISIBILITY_DRUNK
Definition: SharedDefines.h:1261
void AddFlag(FLAG_TYPE flag)
Definition: Object.h:366
void DelFlag(FLAG_TYPE flag)
Definition: Object.h:367
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
Definition: Object.h:519
int32 GetFakeDrunkValue() const
Definition: Player.h:2148

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::AddFlag(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::DelFlag(), GetDrunkValue(), GetFakeDrunkValue(), INVISIBILITY_DRUNK, WorldObject::m_invisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by AuraEffect::HandleAuraModFakeInebriation(), and SetDrunkValue().

◆ UpdateItemDuration()

void Player::UpdateItemDuration ( uint32  time,
bool  realtimeonly = false 
)
4161{
4162 if (m_itemDuration.empty())
4163 return;
4164
4165 LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration({}, {})", time, realtimeonly);
4166
4167 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();)
4168 {
4169 Item* item = *itr;
4170 ++itr; // current element can be erased in UpdateDuration
4171
4172 if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME))
4173 item->UpdateDuration(this, time);
4174 }
4175}
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition: ItemTemplate.h:219
void UpdateDuration(Player *owner, uint32 diff)
Definition: Item.cpp:319
bool HasFlagCu(ItemFlagsCustom flag) const
Definition: ItemTemplate.h:829

References Item::GetTemplate(), ItemTemplate::HasFlagCu(), ITEM_FLAGS_CU_DURATION_REAL_TIME, LOG_DEBUG, m_itemDuration, and Item::UpdateDuration().

Referenced by LoadFromDB(), and Update().

◆ UpdateLocalChannels()

void Player::UpdateLocalChannels ( uint32  newZone)
463{
464 // pussywizard: mutex needed (tc changed opcode to THREAD UNSAFE)
465 static std::mutex channelsLock;
466 std::lock_guard<std::mutex> guard(channelsLock);
467
468 if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar())
469 return; // The client handles it automatically after loading, but not
470 // after teleporting
471
472 AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone);
473 if (!current_zone)
474 return;
475
477 if (!cMgr)
478 return;
479
480 std::string current_zone_name =
481 current_zone->area_name[GetSession()->GetSessionDbcLocale()];
482
483 for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
484 {
485 if (ChatChannelsEntry const* channel =
486 sChatChannelsStore.LookupEntry(i))
487 {
488 Channel* usedChannel = nullptr;
489
490 for (Channel* channel : m_channels)
491 {
492 if (channel && channel->GetChannelId() == i)
493 {
494 usedChannel = channel;
495 break;
496 }
497 }
498
499 Channel* removeChannel = nullptr;
500 Channel* joinChannel = nullptr;
501 bool sendRemove = true;
502
503 if (CanJoinConstantChannelInZone(channel, current_zone))
504 {
505 if (!(channel->flags & CHANNEL_DBC_FLAG_GLOBAL))
506 {
507 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY &&
508 usedChannel)
509 continue; // Already on the channel, as city channel
510 // names are not changing
511
512 char new_channel_name_buf[100];
513 char const* currentNameExt;
514
515 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY)
516 currentNameExt = sObjectMgr->GetAcoreStringForDBCLocale(
518 else
519 currentNameExt = current_zone_name.c_str();
520
521 snprintf(new_channel_name_buf, 100,
522 channel->pattern[m_session->GetSessionDbcLocale()],
523 currentNameExt);
524
525 joinChannel = cMgr->GetJoinChannel(new_channel_name_buf,
526 channel->ChannelID);
527 if (usedChannel)
528 {
529 if (joinChannel != usedChannel)
530 {
531 removeChannel = usedChannel;
532 sendRemove = false; // Do not send leave channel, it
533 // already replaced at client
534 }
535 else
536 joinChannel = nullptr;
537 }
538 }
539 else
540 joinChannel = cMgr->GetJoinChannel(
541 channel->pattern[m_session->GetSessionDbcLocale()],
542 channel->ChannelID);
543 }
544 else
545 removeChannel = usedChannel;
546
547 if (joinChannel)
548 joinChannel->JoinChannel(
549 this, ""); // Changed Channel: ... or Joined Channel: ...
550
551 if (removeChannel)
552 {
553 removeChannel->LeaveChannel(this,
554 sendRemove); // Leave old channel
555 std::string name =
556 removeChannel
557 ->GetName(); // Store name, (*i)erase in LeftChannel
558 LeftChannel(removeChannel); // Remove from player's channel list
559 }
560 }
561 }
562}
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
@ CHANNEL_DBC_FLAG_GLOBAL
Definition: Channel.h:99
@ LANG_CHANNEL_CITY
Definition: Language.h:758
void JoinChannel(Player *player, std::string const &pass)
Definition: Channel.cpp:157
std::string const & GetName() const
Definition: Channel.h:183
Definition: ChannelMgr.h:30
static ChannelMgr * forTeam(TeamId teamId)
Definition: ChannelMgr.cpp:33
Channel * GetJoinChannel(std::string const &name, uint32 channel_id)
Definition: ChannelMgr.cpp:121
void LeftChannel(Channel *c)
Definition: Player.cpp:4940
bool CanJoinConstantChannelInZone(ChatChannelsEntry const *channel, AreaTableEntry const *zone)
Definition: Player.cpp:4917
LocaleConstant GetSessionDbcLocale() const
Definition: WorldSession.h:497
char const * area_name[16]
Definition: DBCStructure.h:527
Definition: DBCStructure.h:643

References AreaTableEntry::area_name, CanJoinConstantChannelInZone(), CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GLOBAL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), Channel::GetName(), GetSession(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsBeingTeleportedFar(), Channel::JoinChannel(), LANG_CHANNEL_CITY, Channel::LeaveChannel(), LeftChannel(), m_channels, m_session, sAreaTableStore, sChatChannelsStore, and sObjectMgr.

Referenced by UpdateZone().

◆ UpdateLootAchievements()

void Player::UpdateLootAchievements ( LootItem item,
Loot loot 
)

◆ UpdateManaRegen()

void Player::UpdateManaRegen ( )
925{
927 {
930 return;
931 }
932
933 float Intellect = GetStat(STAT_INTELLECT);
934 // Mana regen from spirit and intellect
935 float power_regen = std::sqrt(Intellect) * OCTRegenMPPerSpirit();
936 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
938
939 // Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
941
942 // Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
944 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
945 {
946 power_regen_mp5 += GetStat(Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
947 }
948
949 // Set regen rate in cast state apply only on spirit based regen
951 if (modManaRegenInterrupt > 100)
952 modManaRegenInterrupt = 100;
953 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt));
954
955 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
956}
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
Definition: SpellAuraDefines.h:197
@ SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
Definition: SpellAuraDefines.h:282
float OCTRegenMPPerSpirit()
Definition: Player.cpp:5183
float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5977

References CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetStat(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), Unit::GetTotalAuraMultiplierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), m_baseManaRegen, OCTRegenMPPerSpirit(), POWER_MANA, Object::SetStatFloatValue(), SPELL_AURA_MOD_MANA_REGEN_FROM_STAT, SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, STAT_INTELLECT, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, and UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER.

Referenced by ApplyManaRegenBonus(), AuraEffect::HandleModManaRegen(), AuraEffect::HandleModPowerRegen(), UpdateAllStats(), and UpdateStats().

◆ UpdateMaxHealth()

void Player::UpdateMaxHealth ( )
overridevirtual

Implements Unit.

297{
298 UnitMods unitMod = UNIT_MOD_HEALTH;
299
300 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
301 value *= GetModifierValue(unitMod, BASE_PCT);
303 value *= GetModifierValue(unitMod, TOTAL_PCT);
304
305 sScriptMgr->OnAfterUpdateMaxHealth(this, value);
306 SetMaxHealth((uint32)value);
307}
float GetHealthBonusFromStamina()
Definition: StatSystem.cpp:276

References BASE_PCT, BASE_VALUE, Unit::GetCreateHealth(), GetHealthBonusFromStamina(), Unit::GetModifierValue(), Unit::SetMaxHealth(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_HEALTH.

Referenced by UpdateAllStats(), and UpdateStats().

◆ UpdateMaxPower()

void Player::UpdateMaxPower ( Powers  power)
overridevirtual

Implements Unit.

310{
311 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_POWER_START) + power);
312
313 float bonusPower = (power == POWER_MANA && GetCreatePowers(power) > 0) ? GetManaBonusFromIntellect() : 0;
314
315 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
316 value *= GetModifierValue(unitMod, BASE_PCT);
317 value += GetModifierValue(unitMod, TOTAL_VALUE) + bonusPower;
318 value *= GetModifierValue(unitMod, TOTAL_PCT);
319
320 sScriptMgr->OnAfterUpdateMaxPower(this, power, value);
321 SetMaxPower(power, uint32(value));
322}
@ UNIT_MOD_POWER_START
Definition: Unit.h:174
float GetManaBonusFromIntellect()
Definition: StatSystem.cpp:286

References BASE_PCT, BASE_VALUE, Unit::GetCreatePowers(), GetManaBonusFromIntellect(), Unit::GetModifierValue(), POWER_MANA, Unit::SetMaxPower(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_POWER_START.

Referenced by Create(), UpdateAllStats(), and UpdateStats().

◆ UpdateMeleeHitChances()

void Player::UpdateMeleeHitChances ( )

◆ UpdateMirrorTimers()

void Player::UpdateMirrorTimers ( )
428{
429 // Desync flags for update on next HandleDrowning
431 m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
432}

References m_MirrorTimerFlags, and m_MirrorTimerFlagsLast.

Referenced by AuraEffect::HandleWaterBreathing().

◆ UpdateNextMailTimeAndUnreads()

void Player::UpdateNextMailTimeAndUnreads ( )
435{
436 // Update the next delivery time and unread mails
437 time_t cTime = GameTime::GetGameTime().count();
438
440 unReadMails = 0;
441
442 for (Mail const* mail : GetMails())
443 {
444 if (mail->deliver_time > cTime)
445 {
446 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > mail->deliver_time)
447 m_nextMailDelivereTime = mail->deliver_time;
448 }
449
450 // must be not checked yet
451 if (mail->checked & MAIL_CHECK_MASK_READ)
452 continue;
453
454 // and already delivered or expired
455 if (cTime < mail->deliver_time || cTime > mail->expire_time)
456 continue;
457
458 unReadMails++;
459 }
460}
@ MAIL_CHECK_MASK_READ
Definition: Mail.h:48
PlayerMails const & GetMails() const
Definition: Player.h:1636

References GameTime::GetGameTime(), GetMails(), m_nextMailDelivereTime, MAIL_CHECK_MASK_READ, and unReadMails.

Referenced by _LoadMail(), and WorldSession::HandleGetMailList().

◆ UpdateObjectVisibility()

void Player::UpdateObjectVisibility ( bool  forced = true,
bool  fromUpdate = false 
)
overridevirtual

Reimplemented from WorldObject.

1568{
1569 // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map)
1570 if (!IsInWorld())
1571 return;
1572
1573 if (!forced)
1575 else if (!isBeingLoaded())
1576 {
1577 if (!fromUpdate) // pussywizard:
1578 {
1580 return;
1581 }
1584 }
1585}
void AddToNotify(uint16 f)
Definition: Object.cpp:2973
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19047

References WorldObject::AddToNotify(), Unit::bRequestForcedVisibilityUpdate, isBeingLoaded(), Object::IsInWorld(), NOTIFY_VISIBILITY_CHANGED, Unit::UpdateObjectVisibility(), and UpdateVisibilityForPlayer().

Referenced by Map::AddPlayerToMap(), gm_commandscript::HandleGMVisibleCommand(), WorldSession::HandlePlayerLoginToCharInWorld(), Map::PlayerRelocation(), ResurrectPlayer(), SetGameMaster(), SetGroup(), Update(), and UpdateInvisibilityDrunkDetect().

◆ UpdateParryPercentage()

void Player::UpdateParryPercentage ( )
736{
737 const float parry_cap[MAX_CLASSES] =
738 {
739 47.003525f, // Warrior
740 47.003525f, // Paladin
741 145.560408f, // Hunter
742 145.560408f, // Rogue
743 0.0f, // Priest
744 47.003525f, // DK
745 145.560408f, // Shaman
746 0.0f, // Mage
747 0.0f, // Warlock
748 0.0f, // ??
749 0.0f // Druid
750 };
751
752 // No parry
753 float value = 0.0f;
754 m_realParry = 0.0f;
755 uint32 pclass = getClass() - 1;
756 if (CanParry() && parry_cap[pclass] > 0.0f)
757 {
758 float nondiminishing = 5.0f;
759 // Parry from rating
760 float diminishing = GetRatingBonusValue(CR_PARRY);
761 // Modify value from defense skill (only bonus from defense rating diminishes)
762 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
763 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
764 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
766 // apply diminishing formula to diminishing parry chance
767 m_realParry = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
768 m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry;
769
770 value = std::max(diminishing + nondiminishing, 0.0f);
771
772 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
773 {
774 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) : value;
775 }
776 }
777
779}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110
bool CanParry() const
Definition: Player.h:2159

References CanParry(), CR_DEFENSE_SKILL, CR_PARRY, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realParry, MAX_CLASSES, PLAYER_PARRY_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_PARRY_PERCENT.

Referenced by AuraEffect::HandleAuraModParryPercent(), SetCanParry(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdatePlayerSetting()

void Player::UpdatePlayerSetting ( std::string  source,
uint8  index,
uint32  value 
)
116{
117 auto itr = m_charSettingsMap.find(source);
118 uint8 size = index + 1;
119
120 if (itr == m_charSettingsMap.end())
121 {
122 // Settings not found, initialize a new entry.
123 PlayerSettingVector setting;
124 setting.resize(size);
125
126 for (uint32 itr = 0; itr <= index; ++itr)
127 {
128 PlayerSetting set;
129 set.value = itr == index ? value : 0;
130
131 setting[itr] = set;
132 }
133
134 m_charSettingsMap[source] = setting;
135 }
136 else
137 {
138 if (size > itr->second.size())
139 {
140 itr->second.resize(size);
141 }
142 itr->second[index].value = value;
143 }
144}

References m_charSettingsMap, and PlayerSetting::value.

Referenced by GetPlayerSetting(), and player_settings_commandscript::HandleSettingsAnnouncerFlags().

◆ UpdatePosition() [1/2]

bool Player::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline
1998{ return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
Definition: PlayerUpdates.cpp:1111

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and UpdatePosition().

Referenced by UpdatePosition().

◆ UpdatePosition() [2/2]

bool Player::UpdatePosition ( float  x,
float  y,
float  z,
float  orientation,
bool  teleport = false 
)
overridevirtual

Reimplemented from Unit.

1113{
1114 if (!Unit::UpdatePosition(x, y, z, orientation, teleport))
1115 return false;
1116
1117 // Update player zone if needed
1118 if (m_needZoneUpdate)
1119 {
1120 uint32 newZone, newArea;
1121 GetZoneAndAreaId(newZone, newArea);
1122 UpdateZone(newZone, newArea);
1123 m_needZoneUpdate = false;
1124 }
1125
1126 if (GetGroup())
1128
1131
1133
1134 return true;
1135}
@ GROUP_UPDATE_FLAG_POSITION
Definition: Group.h:108
void CheckAreaExploreAndOutdoor()
Definition: Player.cpp:5671
Player * GetTrader() const
Definition: Player.h:1366
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:19944

References CheckAreaExploreAndOutdoor(), GetGroup(), GetSession(), GetTrader(), WorldObject::GetZoneAndAreaId(), GROUP_UPDATE_FLAG_POSITION, INTERACTION_DISTANCE, WorldObject::IsWithinDistInMap(), m_needZoneUpdate, WorldSession::SendCancelTrade(), SetGroupUpdateFlag(), Unit::UpdatePosition(), and UpdateZone().

Referenced by spell_rog_killing_spree_aura::HandleEffectPeriodic(), and WorldSession::HandleMoveTeleportAck().

◆ UpdatePotionCooldown()

void Player::UpdatePotionCooldown ( Spell spell = nullptr)
1498{
1499 // no potion used i combat or still in combat
1500 if (!GetLastPotionId() || IsInCombat())
1501 return;
1502
1503 // Call not from spell cast, send cooldown event for item spells if no in
1504 // combat
1505 if (!spell)
1506 {
1507 // spell/item pair let set proper cooldown (except not existed charged
1508 // spell cooldown spellmods for potions)
1509 if (ItemTemplate const* proto =
1510 sObjectMgr->GetItemTemplate(GetLastPotionId()))
1511 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
1512 if (proto->Spells[idx].SpellId &&
1513 proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
1514 if (SpellInfo const* spellInfo =
1515 sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
1516 SendCooldownEvent(spellInfo, GetLastPotionId());
1517 }
1518 // from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
1519 else
1520 {
1521 if (spell->IsIgnoringCooldowns())
1522 return;
1523
1525 }
1526
1527 SetLastPotionId(0);
1528}
void SetLastPotionId(uint32 item_id)
Definition: Player.h:1789
uint32 GetLastPotionId()
Definition: Player.h:1788
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11061
bool IsIgnoringCooldowns() const
Definition: Spell.cpp:8060

References GetLastPotionId(), Spell::IsIgnoringCooldowns(), Unit::IsInCombat(), ITEM_SPELLTRIGGER_ON_USE, m_lastPotionId, Spell::m_spellInfo, MAX_ITEM_SPELLS, SendCooldownEvent(), SetLastPotionId(), sObjectMgr, and sSpellMgr.

Referenced by Spell::finish().

◆ UpdatePvP()

void Player::UpdatePvP ( bool  state,
bool  _override = false 
)
1481{
1482 if (!state || _override)
1483 {
1484 SetPvP(state);
1485 pvpInfo.EndTimer = 0;
1486 }
1487 else
1488 {
1490 SetPvP(state);
1491 }
1492
1494 sScriptMgr->OnPlayerPVPFlagChange(this, state);
1495}
@ PLAYER_FLAGS_PVP_TIMER
Definition: Player.h:492
void SetPvP(bool state)
Definition: Player.h:1826

References PvPInfo::EndTimer, GameTime::GetGameTime(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, RemovePlayerFlag(), SetPvP(), and sScriptMgr.

Referenced by Unit::CombatStart(), Unit::CombatStartOnCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), FlagPlayerPvP(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleTogglePvP(), UpdatePvPFlag(), and UpdatePvPState().

◆ UpdatePvPFlag()

void Player::UpdatePvPFlag ( time_t  currTime)
373{
374 if (!IsPvP())
375 return;
376
377 if (pvpInfo.EndTimer == 0 || pvpInfo.IsHostile)
378 return;
379
380 if (currTime < (pvpInfo.EndTimer + 300 + 5))
381 {
382 if (currTime > (pvpInfo.EndTimer + 4) && !HasPlayerFlag(PLAYER_FLAGS_PVP_TIMER))
384
385 return;
386 }
387
388 UpdatePvP(false);
389}
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1480

References PvPInfo::EndTimer, HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, SetPlayerFlag(), and UpdatePvP().

Referenced by Update().

◆ UpdatePvPState()

void Player::UpdatePvPState ( )
1391{
1393
1394 if (pvpInfo.IsHostile) // in hostile area
1395 {
1396 if (!IsPvP() || pvpInfo.EndTimer != 0)
1397 UpdatePvP(true, true);
1398 }
1399 else // in friendly area
1400 {
1402 pvpInfo.EndTimer == 0)
1403 pvpInfo.EndTimer = GameTime::GetGameTime().count(); // start toggle-off
1404 }
1405}
@ PLAYER_FLAGS_IN_PVP
Definition: Player.h:483

References PvPInfo::EndTimer, GameTime::GetGameTime(), HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_IN_PVP, pvpInfo, UpdateFFAPvPState(), and UpdatePvP().

Referenced by AddQuest(), Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), Unit::SetCharm(), and UpdateZone().

◆ UpdateRangedHitChances()

◆ UpdateRating()

void Player::UpdateRating ( CombatRating  cr)
572{
573 int32 amount = m_baseRatingValue[cr];
574 // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
575 // stat used stored in miscValueB for this aura
576 AuraEffectList const& modRatingFromStat =
578 for (AuraEffectList::const_iterator i = modRatingFromStat.begin();
579 i != modRatingFromStat.end(); ++i)
580 if ((*i)->GetMiscValue() & (1 << cr))
581 amount += int32(CalculatePct(GetStat(Stats((*i)->GetMiscValueB())),
582 (*i)->GetAmount()));
583 if (amount < 0)
584 amount = 0;
585 SetUInt32Value(static_cast<uint16>(PLAYER_FIELD_COMBAT_RATING_1) + static_cast<uint16>(cr), uint32(amount));
586
587 bool affectStats = CanModifyStats();
588
589 switch (cr)
590 {
591 case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
592 case CR_DEFENSE_SKILL:
594 break;
595 case CR_DODGE:
597 break;
598 case CR_PARRY:
600 break;
601 case CR_BLOCK:
603 break;
604 case CR_HIT_MELEE:
606 break;
607 case CR_HIT_RANGED:
609 break;
610 case CR_HIT_SPELL:
612 break;
613 case CR_CRIT_MELEE:
614 if (affectStats)
615 {
618 }
619 break;
620 case CR_CRIT_RANGED:
621 if (affectStats)
623 break;
624 case CR_CRIT_SPELL:
625 if (affectStats)
627 break;
628 case CR_HIT_TAKEN_MELEE: // Implemented in Unit::MeleeMissChanceCalc
630 break;
631 case CR_HIT_TAKEN_SPELL: // Implemented in Unit::MagicSpellHitResult
632 break;
633 case CR_CRIT_TAKEN_MELEE: // Implemented in Unit::RollMeleeOutcomeAgainst
634 // (only for chance to crit)
636 break;
637 case CR_CRIT_TAKEN_SPELL: // Implemented in Unit::SpellCriticalBonus (only
638 // for chance to crit)
639 break;
640 case CR_HASTE_MELEE: // Implemented in Player::ApplyRatingMod
641 case CR_HASTE_RANGED:
642 case CR_HASTE_SPELL:
643 break;
644 case CR_WEAPON_SKILL_MAINHAND: // Implemented in
645 // Unit::RollMeleeOutcomeAgainst
648 break;
649 case CR_EXPERTISE:
650 if (affectStats)
651 {
654 }
655 break;
657 if (affectStats)
659 break;
660 }
661}
@ SPELL_AURA_MOD_RATING_FROM_STAT
Definition: SpellAuraDefines.h:283
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:239
@ CR_WEAPON_SKILL
Definition: Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:237
void UpdateArmorPenetration(int32 amount)
Definition: StatSystem.cpp:847
void UpdateSpellHitChances()
Definition: StatSystem.cpp:865
void UpdateMeleeHitChances()
Definition: StatSystem.cpp:853
void UpdateRangedHitChances()
Definition: StatSystem.cpp:859

References BASE_ATTACK, CalculatePct(), Unit::CanModifyStats(), CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, Unit::GetAuraEffectsByType(), Unit::GetStat(), m_baseRatingValue, OFF_ATTACK, PLAYER_FIELD_COMBAT_RATING_1, RANGED_ATTACK, Unit::SetUInt32Value(), SPELL_AURA_MOD_RATING_FROM_STAT, UpdateAllSpellCritChances(), UpdateArmorPenetration(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDefenseBonusesMod(), UpdateDodgePercentage(), UpdateExpertise(), UpdateMeleeHitChances(), UpdateParryPercentage(), UpdateRangedHitChances(), and UpdateSpellHitChances().

Referenced by ApplyRatingMod(), and UpdateAllRatings().

◆ UpdateResistances()

void Player::UpdateResistances ( uint32  school)
overridevirtual

Implements Unit.

226{
227 if (school > SPELL_SCHOOL_NORMAL)
228 {
229 // cant use GetTotalAuraModValue because of total pct multiplier :P
230 float value = 0.0f;
231 UnitMods unitMod = UnitMods(UNIT_MOD_RESISTANCE_START + school);
232
233 value = GetModifierValue(unitMod, BASE_VALUE);
234 value *= GetModifierValue(unitMod, BASE_PCT);
235 value += GetModifierValue(unitMod, TOTAL_VALUE);
236
238 for(AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
239 {
240 if((*i)->GetMiscValue() & (1 << (school - 1)) )
241 value += int32(GetStat(Stats((*i)->GetMiscValueB())) * (*i)->GetAmount() / 100.0f);
242 }
243
244 value *= GetModifierValue(unitMod, TOTAL_PCT);
245
246 SetResistance(SpellSchools(school), int32(value));
247 }
248 else
249 UpdateArmor();
250}

References BASE_PCT, BASE_VALUE, Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetResistance(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_RESISTANCE_START, and UpdateArmor().

◆ UpdateRuneRegen()

void Player::UpdateRuneRegen ( RuneType  rune)
959{
960 if (rune >= NUM_RUNE_TYPES)
961 return;
962
963 uint32 cooldown = 0;
964
965 for (uint32 i = 0; i < MAX_RUNES; ++i)
966 if (GetBaseRune(i) == rune)
967 {
968 cooldown = GetRuneBaseCooldown(i, true);
969 break;
970 }
971
972 if (cooldown <= 0)
973 return;
974
975 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
977}
uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace)
Definition: Player.cpp:13316

References GetBaseRune(), GetRuneBaseCooldown(), IN_MILLISECONDS, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, and Object::SetFloatValue().

Referenced by AuraEffect::HandleModPowerRegen().

◆ UpdateShieldBlockValue()

void Player::UpdateShieldBlockValue ( )
523{
525}
uint32 GetShieldBlockValue() const override
Definition: Player.cpp:5029

References GetShieldBlockValue(), PLAYER_SHIELD_BLOCK, and Unit::SetUInt32Value().

Referenced by HandleBaseModValue(), UpdateAllStats(), and UpdateStats().

◆ UpdateSkill()

bool Player::UpdateSkill ( uint32  skill_id,
uint32  step 
)
671{
672 if (!skill_id)
673 return false;
674
675 SkillStatusMap::iterator itr = mSkillStatus.find(skill_id);
676 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
677 return false;
678
679 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
680 uint32 data = GetUInt32Value(valueIndex);
681 uint32 value = SKILL_VALUE(data);
682 uint32 max = SKILL_MAX(data);
683
684 if ((!max) || (!value) || (value >= max))
685 return false;
686
687 if (value < max)
688 {
689 uint32 new_value = value + step;
690 if (new_value > max)
691 new_value = max;
692
693 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, max));
694 if (itr->second.uState != SKILL_NEW)
695 itr->second.uState = SKILL_CHANGED;
696
697 UpdateSkillEnchantments(skill_id, value, new_value);
699 skill_id);
700 return true;
701 }
702
703 return false;
704}

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateDefense(), and UpdateWeaponSkill().

◆ UpdateSkillEnchantments()

void Player::UpdateSkillEnchantments ( uint16  skill_id,
uint16  curr_value,
uint16  new_value 
)
4697{
4698 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
4699 {
4700 if (m_items[i])
4701 {
4702 for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4703 {
4704 uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot));
4705 if (!ench_id)
4706 continue;
4707
4708 SpellItemEnchantmentEntry const* Enchant = sSpellItemEnchantmentStore.LookupEntry(ench_id);
4709 if (!Enchant)
4710 return;
4711
4712 if (Enchant->requiredSkill == skill_id)
4713 {
4714 // Checks if the enchantment needs to be applied or removed
4715 if (curr_value < Enchant->requiredSkillValue && new_value >= Enchant->requiredSkillValue)
4716 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4717 else if (new_value < Enchant->requiredSkillValue && curr_value >= Enchant->requiredSkillValue)
4718 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4719 }
4720
4721 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4722 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4724 && !m_items[i]->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4725 {
4726 SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(m_items[i]->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT));
4727
4728 if (pPrismaticEnchant && pPrismaticEnchant->requiredSkill == skill_id)
4729 {
4730 if (curr_value < pPrismaticEnchant->requiredSkillValue && new_value >= pPrismaticEnchant->requiredSkillValue)
4731 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4732 else if (new_value < pPrismaticEnchant->requiredSkillValue && curr_value >= pPrismaticEnchant->requiredSkillValue)
4733 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4734 }
4735 }
4736 }
4737 }
4738 }
4739}
Definition: Socket.h:52

References ApplyEnchantment(), Item::GetEnchantmentId(), INVENTORY_SLOT_BAG_END, m_items, MAX_ENCHANTMENT_SLOT, PRISMATIC_ENCHANTMENT_SLOT, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, and sSpellItemEnchantmentStore.

Referenced by SetSkill(), UpdateSkill(), and UpdateSkillPro().

◆ UpdateSkillPro()

bool Player::UpdateSkillPro ( uint16  SkillId,
int32  Chance,
uint32  step 
)
871{
872 LOG_DEBUG("entities.player.skills",
873 "UpdateSkillPro(SkillId {}, Chance {:3.1f}%)", SkillId,
874 Chance / 10.0f);
875 if (!SkillId)
876 return false;
877
878 if (Chance <= 0) // speedup in 0 chance case
879 {
880 LOG_DEBUG("entities.player.skills",
881 "Player::UpdateSkillPro Chance={:3.1f}% missed",
882 Chance / 10.0f);
883 return false;
884 }
885
886 SkillStatusMap::iterator itr = mSkillStatus.find(SkillId);
887 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
888 return false;
889
890 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
891
892 uint32 data = GetUInt32Value(valueIndex);
893 uint16 SkillValue = SKILL_VALUE(data);
894 uint16 MaxValue = SKILL_MAX(data);
895
896 if (!MaxValue || !SkillValue || SkillValue >= MaxValue)
897 return false;
898
899 int32 Roll = irand(1, 1000);
900
901 if (Roll <= Chance)
902 {
903 uint32 new_value = SkillValue + step;
904 if (new_value > MaxValue)
905 new_value = MaxValue;
906
907 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue));
908 if (itr->second.uState != SKILL_NEW)
909 itr->second.uState = SKILL_CHANGED;
910
911 for (std::size_t i = 0; i < bonusSkillLevelsSize; ++i)
912 {
913 uint32 bsl = bonusSkillLevels[i];
914 if (SkillValue < bsl && new_value >= bsl)
915 {
916 learnSkillRewardedSpells(SkillId, new_value);
917 break;
918 }
919 }
920 UpdateSkillEnchantments(SkillId, SkillValue, new_value);
922 SkillId);
923 LOG_DEBUG("entities.player.skills",
924 "Player::UpdateSkillPro Chance={:3.1f}% taken",
925 Chance / 10.0f);
926 return true;
927 }
928
929 LOG_DEBUG("entities.player.skills",
930 "Player::UpdateSkillPro Chance={:3.1f}% missed", Chance / 10.0f);
931 return false;
932}
static uint32 bonusSkillLevels[]
Definition: PlayerUpdates.cpp:866
static const std::size_t bonusSkillLevelsSize
Definition: PlayerUpdates.cpp:867
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
Definition: Group.h:143

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, bonusSkillLevels, bonusSkillLevelsSize, Object::GetUInt32Value(), irand(), learnSkillRewardedSpells(), LOG_DEBUG, MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateCraftSkill(), UpdateFishingSkill(), and UpdateGatherSkill().

◆ UpdateSkillsForLevel()

void Player::UpdateSkillsForLevel ( )

update only level dependent max skill values

maximize skill always

update max skill value if current max skill not maximized

1035{
1036 uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
1037 uint32 maxSkill = GetMaxSkillValueForLevel();
1038
1039 bool alwaysMaxSkill =
1041
1042 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1043 itr != mSkillStatus.end(); ++itr)
1044 {
1045 if (itr->second.uState == SKILL_DELETED)
1046 continue;
1047
1048 uint32 pskill = itr->first;
1049 SkillRaceClassInfoEntry const* rcEntry =
1051 if (!rcEntry)
1052 continue;
1053
1054 if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL)
1055 continue;
1056
1057 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1058 uint32 data = GetUInt32Value(valueIndex);
1059 uint32 max = SKILL_MAX(data);
1060 uint32 val = SKILL_VALUE(data);
1061
1063 if (max != 1)
1064 {
1066 if (alwaysMaxSkill ||
1068 {
1069 SetUInt32Value(valueIndex,
1070 MAKE_SKILL_VALUE(maxSkill, maxSkill));
1071 if (itr->second.uState != SKILL_NEW)
1072 itr->second.uState = SKILL_CHANGED;
1073 }
1074 else if (max != maxconfskill)
1076 {
1077 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(val, maxSkill));
1078 if (itr->second.uState != SKILL_NEW)
1079 itr->second.uState = SKILL_CHANGED;
1080 }
1081 }
1082 }
1083}
@ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
Definition: IWorld.h:100

References CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_MAX, SKILL_NEW, SKILL_RANGE_LEVEL, SKILL_VALUE, and sWorld.

Referenced by GiveLevel(), InitStatsForLevel(), and LoadFromDB().

◆ UpdateSkillsToMaxSkillsForLevel()

void Player::UpdateSkillsToMaxSkillsForLevel ( )
1086{
1087 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1088 itr != mSkillStatus.end(); ++itr)
1089 {
1090 if (itr->second.uState == SKILL_DELETED)
1091 continue;
1092
1093 uint32 pskill = itr->first;
1094 if (IsProfessionOrRidingSkill(pskill))
1095 continue;
1096 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1097 uint32 data = GetUInt32Value(valueIndex);
1098 uint32 max = SKILL_MAX(data);
1099
1100 if (max > 1)
1101 {
1102 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(max, max));
1103 if (itr->second.uState != SKILL_NEW)
1104 itr->second.uState = SKILL_CHANGED;
1105 }
1106 if (pskill == SKILL_DEFENSE)
1108 }
1109}

References Object::GetUInt32Value(), IsProfessionOrRidingSkill(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DEFENSE, SKILL_DELETED, SKILL_MAX, SKILL_NEW, and UpdateDefenseBonusesMod().

Referenced by GiveLevel(), and misc_commandscript::HandleMaxSkillCommand().

◆ UpdateSoulboundTradeItems()

void Player::UpdateSoulboundTradeItems ( )
4124{
4125 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4126 if (m_itemSoulboundTradeable.empty())
4127 return;
4128
4129 // also checks for garbage data
4130 for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
4131 {
4132 ASSERT(*itr);
4133 if ((*itr)->GetOwnerGUID() != GetGUID())
4134 {
4135 m_itemSoulboundTradeable.erase(itr++);
4136 continue;
4137 }
4138 if ((*itr)->CheckSoulboundTradeExpire())
4139 {
4140 m_itemSoulboundTradeable.erase(itr++);
4141 continue;
4142 }
4143 ++itr;
4144 }
4145}

References ASSERT, Object::GetGUID(), m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by Update().

◆ UpdateSpeakTime()

void Player::UpdateSpeakTime ( ChatFloodThrottle::Index  index)
30{
31 // ignore chat spam protection for GMs in any mode
33 return;
34
35 uint32 limit, delay;
36 switch (index)
37 {
39 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT);
40 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY);
41 break;
43 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT);
44 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY);
45 [[fallthrough]];
46 default:
47 return;
48 }
49 time_t current = GameTime::GetGameTime().count();
50 if (m_chatFloodData[index].Time > current)
51 {
52 ++m_chatFloodData[index].Count;
53 if (m_chatFloodData[index].Count >= limit)
54 {
55 // prevent overwrite mute time, if message send just before mutes set, for example.
56 time_t new_mute = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MUTE_TIME);
57 if (GetSession()->m_muteTime < new_mute)
58 GetSession()->m_muteTime = new_mute;
59
60 m_chatFloodData[index].Count = 0;
61 }
62 }
63 else
64 m_chatFloodData[index].Count = 1;
65
66 m_chatFloodData[index].Time = current + delay;
67}
@ CONFIG_CHATFLOOD_MUTE_TIME
Definition: IWorld.h:285
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition: IWorld.h:283
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition: IWorld.h:282
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition: IWorld.h:281
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition: IWorld.h:284
std::array< ChatFloodThrottle, ChatFloodThrottle::MAX > m_chatFloodData
Definition: Player.h:2745
@ ADDON
Definition: Player.h:2294
@ REGULAR
Definition: Player.h:2293

References Player::ChatFloodThrottle::ADDON, CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, CONFIG_CHATFLOOD_MESSAGE_COUNT, CONFIG_CHATFLOOD_MESSAGE_DELAY, CONFIG_CHATFLOOD_MUTE_TIME, GameTime::GetGameTime(), GetSession(), AccountMgr::IsPlayerAccount(), m_chatFloodData, WorldSession::m_muteTime, Player::ChatFloodThrottle::REGULAR, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode(), and WorldSession::HandleTextEmoteOpcode().

◆ UpdateSpecCount()

void Player::UpdateSpecCount ( uint8  count)
2145{
2146 uint32 curCount = GetSpecsCount();
2147 if (curCount == count)
2148 return;
2149
2150 if (m_activeSpec >= count)
2151 ActivateSpec(0);
2152
2153 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2154 CharacterDatabasePreparedStatement* stmt = nullptr;
2155
2156 // Copy spec data
2157 if (count > curCount)
2158 {
2159 _SaveActions(trans); // make sure the button list is cleaned up
2160 for (ActionButtonList::iterator itr = m_actionButtons.begin();
2161 itr != m_actionButtons.end(); ++itr)
2162 {
2163 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
2164 stmt->SetData(0, GetGUID().GetCounter());
2165 stmt->SetData(1, 1);
2166 stmt->SetData(2, itr->first);
2167 stmt->SetData(3, itr->second.GetAction());
2168 stmt->SetData(4, uint8(itr->second.GetType()));
2169 trans->Append(stmt);
2170 }
2171 }
2172 // Delete spec data for removed spec.
2173 else if (count < curCount)
2174 {
2175 _SaveActions(trans);
2176
2177 stmt = CharacterDatabase.GetPreparedStatement(
2179 stmt->SetData(0, m_activeSpec);
2180 stmt->SetData(1, GetGUID().GetCounter());
2181 trans->Append(stmt);
2182
2183 m_activeSpec = 0;
2184 }
2185
2186 CharacterDatabase.CommitTransaction(trans);
2187
2188 SetSpecsCount(count);
2189
2190 SendTalentsInfoData(false);
2191}
@ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC
Definition: CharacterDatabase.h:454
void ActivateSpec(uint8 spec)
Definition: Player.cpp:15019
void SetSpecsCount(uint8 count)
Definition: Player.h:1724

References _SaveActions(), ActivateSpec(), CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, CHAR_INS_CHAR_ACTION, CharacterDatabase, Object::GetGUID(), GetSpecsCount(), m_actionButtons, m_activeSpec, SendTalentsInfoData(), PreparedStatementBase::SetData(), and SetSpecsCount().

◆ UpdateSpellCritChance()

void Player::UpdateSpellCritChance ( uint32  school)
823{
824 // For normal school set zero crit chance
825 if (school == SPELL_SCHOOL_NORMAL)
826 {
828 return;
829 }
830 // For others recalculate it from:
831 float crit = 0.0f;
832 // Crit from Intellect
834 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
836 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
838 // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
840 // Increase crit from spell crit ratings
842
843 // Store crit value
845}
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
float GetSpellCritFromIntellect()
Definition: Player.cpp:5108
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5912
int32 GetTotalAuraModifierAreaExclusive(AuraType auratype) const
Definition: Unit.cpp:5841

References CR_CRIT_SPELL, GetRatingBonusValue(), GetSpellCritFromIntellect(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierAreaExclusive(), Unit::GetTotalAuraModifierByMiscMask(), PLAYER_SPELL_CRIT_PERCENTAGE1, Object::SetFloatValue(), SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by AuraEffect::HandleModSpellCritChanceShool(), and UpdateAllSpellCritChances().

◆ UpdateSpellDamageAndHealingBonus()

void Player::UpdateSpellDamageAndHealingBonus ( )
178{
179 // Magic damage modifiers implemented in Unit::SpellDamageBonusDone
180 // This information for client side use only
181 // Get healing bonus for all schools
183 // Get damage bonus for all schools
184 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
186}
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12637
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11872

References MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, Object::SetStatInt32Value(), SPELL_SCHOOL_HOLY, SPELL_SCHOOL_MASK_ALL, Unit::SpellBaseDamageBonusDone(), and Unit::SpellBaseHealingBonusDone().

Referenced by AuraEffect::HandleModHealingDone(), AuraEffect::HandleModSpellDamagePercentFromAttackPower(), AuraEffect::HandleModSpellDamagePercentFromStat(), AuraEffect::HandleModSpellHealingPercentFromAttackPower(), AuraEffect::HandleModSpellHealingPercentFromStat(), UpdateAllStats(), UpdateAttackPowerAndDamage(), and UpdateStats().

◆ UpdateSpellHitChances()

void Player::UpdateSpellHitChances ( )

◆ UpdateStats()

bool Player::UpdateStats ( Stats  stat)
overridevirtual

Implements Unit.

98{
99 if (stat > STAT_SPIRIT)
100 return false;
101
102 // value = ((base_value * base_pct) + total_value) * total_pct
103 float value = GetTotalStatValue(stat);
104
105 SetStat(stat, int32(value));
106
107 switch (stat)
108 {
109 case STAT_STRENGTH:
111 break;
112 case STAT_AGILITY:
113 UpdateArmor();
116 break;
117 case STAT_STAMINA:
119 break;
120 case STAT_INTELLECT:
123 UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
124 break;
125 default:
126 break;
127 }
128
129 if (stat == STAT_STRENGTH)
130 {
134 }
135 else if (stat == STAT_AGILITY)
136 {
139 }
140 else
141 {
142 // Need update (exist AP from stat auras)
147 }
148
151
152 // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
153 uint32 mask = 0;
155 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
156 if (Stats((*i)->GetMiscValueB()) == stat)
157 mask |= (*i)->GetMiscValue();
158 if (mask)
159 {
160 for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
161 if (mask & (1 << rating))
162 ApplyRatingMod(CombatRating(rating), 0, true);
163 }
164 return true;
165}

References ApplyRatingMod(), Unit::GetAuraEffectsByType(), Unit::GetTotalStatValue(), Unit::HasAuraTypeWithMiscvalue(), MAX_COMBAT_RATING, POWER_MANA, Unit::SetStat(), SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RATING_FROM_STAT, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDodgePercentage(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

◆ UpdateTitansGrip()

void Player::UpdateTitansGrip ( )

◆ UpdateTriggerVisibility()

void Player::UpdateTriggerVisibility ( )
1697{
1698 if (m_clientGUIDs.empty())
1699 return;
1700
1701 if (!IsInWorld())
1702 return;
1703
1704 UpdateData udata;
1705 WorldPacket packet;
1706 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin();
1707 itr != m_clientGUIDs.end(); ++itr)
1708 {
1709 if ((*itr).IsCreatureOrVehicle())
1710 {
1711 Creature* creature = GetMap()->GetCreature(*itr);
1712 // Update fields of triggers, transformed units or unselectable
1713 // units (values dependent on GM state)
1714 if (!creature || (!creature->IsTrigger() &&
1715 !creature->HasAuraType(SPELL_AURA_TRANSFORM) &&
1717 continue;
1718
1720 creature->BuildValuesUpdateBlockForPlayer(&udata, this);
1722 }
1723 else if ((*itr).IsGameObject())
1724 {
1725 GameObject* go = GetMap()->GetGameObject(*itr);
1726 if (!go)
1727 continue;
1728
1730 go->BuildValuesUpdateBlockForPlayer(&udata, this);
1732 }
1733 }
1734
1735 if (!udata.HasData())
1736 return;
1737
1738 udata.BuildPacket(packet);
1739 GetSession()->SendPacket(&packet);
1740}
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
bool IsTrigger() const
Definition: Creature.h:78
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:192
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:191
bool HasData() const
Definition: UpdateData.h:60

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), Map::GetCreature(), Map::GetGameObject(), WorldObject::GetMap(), GetSession(), Unit::HasAuraType(), UpdateData::HasData(), Unit::HasUnitFlag(), Object::IsInWorld(), Creature::IsTrigger(), m_clientGUIDs, Object::RemoveFieldNotifyFlag(), WorldSession::SendPacket(), Object::SetFieldNotifyFlag(), SPELL_AURA_TRANSFORM, UF_FLAG_PUBLIC, and UNIT_FLAG_NOT_SELECTABLE.

Referenced by gm_commandscript::HandleGMOffCommand(), and gm_commandscript::HandleGMOnCommand().

◆ UpdateVisibilityForPlayer()

void Player::UpdateVisibilityForPlayer ( bool  mapChange = false)
1543{
1544 // After added to map seer must be a player - there is no possibility to
1545 // still have different seer (all charm auras must be already removed)
1546 if (mapChange && m_seer != this)
1547 {
1548 m_seer = this;
1549 }
1550
1551 Acore::VisibleNotifier notifierNoLarge(
1552 *this, mapChange,
1553 false); // visit only objects which are not large; default distance
1554 Cell::VisitAllObjects(m_seer, notifierNoLarge,
1556 notifierNoLarge.SendToSelf();
1557
1558 Acore::VisibleNotifier notifierLarge(
1559 *this, mapChange, true); // visit only large objects; maximum distance
1560 Cell::VisitAllObjects(m_seer, notifierLarge, GetSightRange());
1561 notifierLarge.SendToSelf();
1562
1563 if (mapChange)
1564 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
1565}
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
float GetSightRange(WorldObject const *target=nullptr) const override
Definition: Player.cpp:16234
Position m_last_notify_position
Definition: Unit.h:1752
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:207
Definition: GridNotifiers.h:44

References GetSightRange(), Unit::m_last_notify_position, m_seer, Position::Relocate(), Acore::VisibleNotifier::SendToSelf(), VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

Referenced by WorldSession::HandleFarSightOpcode(), SendInitialPacketsAfterAddToMap(), and UpdateObjectVisibility().

◆ UpdateVisibilityOf() [1/2]

template<class T >
void Player::UpdateVisibilityOf ( T *  target,
UpdateData data,
std::vector< Unit * > &  visibleNow 
)
1635{
1636 if (HaveAtClient(target))
1637 {
1638 if (!CanSeeOrDetect(target, false, true))
1639 {
1640 BeforeVisibilityDestroy<T>(target, this);
1641
1642 target->BuildOutOfRangeUpdateBlock(&data);
1643 m_clientGUIDs.erase(target->GetGUID());
1644 }
1645 }
1646 else
1647 {
1648 if (CanSeeOrDetect(target, false, true))
1649 {
1650 target->BuildCreateUpdateBlockForPlayer(&data, this);
1651 UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
1652 }
1653 }
1654}
void UpdateVisibilityOf_helper(GuidUnorderedSet &s64, T *target, std::vector< Unit * > &)
Definition: PlayerUpdates.cpp:1588
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11364

References WorldObject::CanSeeOrDetect(), HaveAtClient(), m_clientGUIDs, and UpdateVisibilityOf_helper().

◆ UpdateVisibilityOf() [2/2]

void Player::UpdateVisibilityOf ( WorldObject target)
1668{
1669 if (HaveAtClient(target))
1670 {
1671 if (!CanSeeOrDetect(target, false, true))
1672 {
1673 if (target->GetTypeId() == TYPEID_UNIT)
1675
1676 target->DestroyForPlayer(this);
1677 m_clientGUIDs.erase(target->GetGUID());
1678 }
1679 }
1680 else
1681 {
1682 if (CanSeeOrDetect(target, false, true))
1683 {
1684 target->SendUpdateToPlayer(this);
1685 m_clientGUIDs.insert(target->GetGUID());
1686
1687 // target aura duration for caster show only if target exist at
1688 // caster client send data at target visibility change (adding to
1689 // client)
1690 if (target->isType(TYPEMASK_UNIT))
1691 GetInitialVisiblePackets((Unit*) target);
1692 }
1693 }
1694}
void BeforeVisibilityDestroy< Creature >(Creature *t, Player *p)
Definition: PlayerUpdates.cpp:1626
void GetInitialVisiblePackets(Unit *target)
Definition: PlayerUpdates.cpp:1656

References BeforeVisibilityDestroy< Creature >(), WorldObject::CanSeeOrDetect(), Object::DestroyForPlayer(), Object::GetGUID(), GetInitialVisiblePackets(), Object::GetTypeId(), HaveAtClient(), Object::isType(), m_clientGUIDs, Object::SendUpdateToPlayer(), Object::ToCreature(), TYPEID_UNIT, and TYPEMASK_UNIT.

Referenced by instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), Acore::VisibleNotifier::SendToSelf(), SetViewpoint(), Acore::VisibleNotifier::Visit(), Acore::PlayerRelocationNotifier::Visit(), and Acore::CreatureRelocationNotifier::Visit().

◆ UpdateWeaponSkill()

void Player::UpdateWeaponSkill ( Unit victim,
WeaponAttackType  attType,
Item item = nullptr 
)
935{
936 if (IsInFeralForm())
937 return; // always maximized SKILL_FERAL_COMBAT in fact
938
940 return; // use weapon but not skill up
941
942 if (victim->GetTypeId() == TYPEID_UNIT &&
945 return;
946
947 uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
948
949 Item* tmpitem = GetWeaponForAttack(attType, true);
950 if (item && item != tmpitem && !item->IsBroken())
951 {
952 tmpitem = item;
953 }
954
955 if (!tmpitem && attType == BASE_ATTACK)
956 {
957 // Keep unarmed & fist weapon skills in sync
958 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
959 UpdateSkill(SKILL_FIST_WEAPONS, weapon_skill_gain);
960 }
961 else if (tmpitem && tmpitem->GetTemplate()->SubClass !=
963 {
964 switch (tmpitem->GetTemplate()->SubClass)
965 {
967 break;
969 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
970 [[fallthrough]];
971 default:
972 UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
973 break;
974 }
975 }
976
978}
@ ITEM_SUBCLASS_WEAPON_FIST
Definition: ItemTemplate.h:357
@ CREATURE_FLAG_EXTRA_NO_SKILL_GAINS
Definition: CreatureData.h:64
@ FORM_TREE
Definition: UnitDefines.h:71
@ CONFIG_SKILL_GAIN_WEAPON
Definition: IWorld.h:278

References BASE_ATTACK, CONFIG_SKILL_GAIN_WEAPON, CREATURE_FLAG_EXTRA_NO_SKILL_GAINS, CreatureTemplate::flags_extra, FORM_TREE, Creature::GetCreatureTemplate(), Unit::GetShapeshiftForm(), Item::GetSkill(), Item::GetTemplate(), Object::GetTypeId(), GetWeaponForAttack(), Item::IsBroken(), Unit::IsInFeralForm(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_FIST, SKILL_FIST_WEAPONS, SKILL_UNARMED, ItemTemplate::SubClass, sWorld, Object::ToCreature(), TYPEID_UNIT, UpdateAllCritPercentages(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateZone()

void Player::UpdateZone ( uint32  newZone,
uint32  newArea 
)
1208{
1209 if (!newZone)
1210 {
1211 return;
1212 }
1213
1214 if (m_zoneUpdateId != newZone)
1215 {
1216 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1217 sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone);
1218 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1219 sBattlefieldMgr->HandlePlayerEnterZone(this, newZone);
1220 SendInitWorldStates(newZone,
1221 newArea); // only if really enters to new zone, not
1222 // just area change, works strange...
1223 if (Guild* guild = GetGuild())
1224 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
1225 }
1226
1227 // group update
1228 if (GetGroup())
1230
1231 m_zoneUpdateId = newZone;
1233
1234 // zone changed, so area changed as well, update it
1235 UpdateArea(newArea);
1236
1237 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone);
1238 if (!zone)
1239 return;
1240
1241 if (sWorld->getBoolConfig(CONFIG_WEATHER))
1242 {
1243 if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
1244 weather->SendWeatherUpdateToPlayer(this);
1245 else if (!WeatherMgr::AddWeather(zone->ID))
1246 // send fine weather packet to remove old zone's weather
1248 }
1249
1250 sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);
1251
1252 // in PvP, any not controlled zone (except zone->team == 6, default case)
1253 // in PvE, only opposition team capital
1254 switch (zone->team)
1255 {
1256 case AREATEAM_ALLY:
1258 GetTeamId(true) != TEAM_ALLIANCE &&
1259 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1260 break;
1261 case AREATEAM_HORDE:
1263 GetTeamId(true) != TEAM_HORDE &&
1264 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1265 break;
1266 case AREATEAM_NONE:
1267 // overwrite for battlegrounds, maybe batter some zone flags but current
1268 // known not 100% fit to this
1269 pvpInfo.IsInHostileArea = sWorld->IsPvPRealm() || InBattleground() ||
1271 break;
1272 default: // 6 in fact
1273 pvpInfo.IsInHostileArea = false;
1274 break;
1275 }
1276
1277 // Treat players having a quest flagging for PvP as always in hostile area
1279
1280 if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
1281 {
1282 if (!pvpInfo.IsHostile || zone->IsSanctuary())
1284
1285 pvpInfo.IsInNoPvPArea = true;
1286 }
1287 else
1288 RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city
1289
1291
1292 // remove items with area/map limitations (delete only for alive player to
1293 // allow back in ghost mode) if player resurrected at teleport this will be
1294 // applied in resurrect code
1295 if (IsAlive())
1296 DestroyZoneLimitedItem(true, newZone);
1297
1298 // check some item equip limitations (in result lost CanTitanGrip at talent
1299 // reset, for example)
1301
1302 // recent client version not send leave/join channel packets for built-in
1303 // local channels
1304 UpdateLocalChannels(newZone);
1305
1306 UpdateZoneDependentAuras(newZone);
1307}
@ GROUP_UPDATE_FULL
Definition: Group.h:121
@ GUILD_MEMBER_DATA_ZONEID
Definition: Guild.h:61
@ REST_FLAG_IN_CITY
Definition: Player.h:815
@ CONFIG_WEATHER
Definition: IWorld.h:99
@ AREATEAM_HORDE
Definition: DBCEnums.h:58
@ AREATEAM_NONE
Definition: DBCEnums.h:56
@ AREATEAM_ALLY
Definition: DBCEnums.h:57
@ AREA_FLAG_CAPITAL
Definition: DBCEnums.h:242
@ AREA_FLAG_WINTERGRASP
Definition: DBCEnums.h:258
Weather * AddWeather(uint32 zone_id)
Add a Weather object to the list.
Definition: WeatherMgr.cpp:67
void SendFineWeatherUpdateToPlayer(Player *player)
Definition: WeatherMgr.cpp:145
Weather * FindWeather(uint32 id)
Find a Weather object by the given zoneid.
Definition: WeatherMgr.cpp:50
void UpdateLocalChannels(uint32 newZone)
Definition: PlayerUpdates.cpp:462
void SendInitWorldStates(uint32 zone, uint32 area)
Definition: Player.cpp:8142
void DestroyZoneLimitedItem(bool update, uint32 new_zone)
Definition: PlayerStorage.cpp:3327
Weather for one zone.
Definition: Weather.h:65
uint32 ID
Definition: DBCStructure.h:520
uint32 team
Definition: DBCStructure.h:529

References WeatherMgr::AddWeather(), AREA_FLAG_CAPITAL, AREA_FLAG_WINTERGRASP, AREATEAM_ALLY, AREATEAM_HORDE, AREATEAM_NONE, AutoUnequipOffhandIfNeed(), CONFIG_WEATHER, DestroyZoneLimitedItem(), WeatherMgr::FindWeather(), AreaTableEntry::flags, GetGroup(), GetGuild(), GetTeamId(), GROUP_UPDATE_FULL, GUILD_MEMBER_DATA_ZONEID, HasPvPForcingQuest(), AreaTableEntry::ID, InBattleground(), Unit::IsAlive(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_zoneUpdateId, m_zoneUpdateTimer, pvpInfo, RemoveRestFlag(), REST_FLAG_IN_CITY, sAreaTableStore, sBattlefieldMgr, WeatherMgr::SendFineWeatherUpdateToPlayer(), SendInitWorldStates(), SetGroupUpdateFlag(), SetRestFlag(), sOutdoorPvPMgr, sScriptMgr, sWorld, AreaTableEntry::team, TEAM_ALLIANCE, TEAM_HORDE, UpdateArea(), UpdateLocalChannels(), UpdatePvPState(), UpdateZoneDependentAuras(), and ZONE_UPDATE_INTERVAL.

Referenced by WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), ResurrectPlayer(), SendInitialPacketsAfterAddToMap(), Update(), and UpdatePosition().

◆ UpdateZoneDependentAuras()

void Player::UpdateZoneDependentAuras ( uint32  zone_id)
1804{
1805 // Some spells applied at enter into zone (with subzones), aura removed in
1806 // UpdateAreaDependentAuras that called always at zone->area update
1807 SpellAreaForAreaMapBounds saBounds =
1808 sSpellMgr->GetSpellAreaForAreaMapBounds(newZone);
1809 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1810 itr != saBounds.second; ++itr)
1811 if (itr->second->autocast &&
1812 itr->second->IsFitToRequirements(this, newZone, 0))
1813 if (!HasAura(itr->second->spellId))
1814 CastSpell(this, itr->second->spellId, true);
1815}

References Unit::CastSpell(), Unit::HasAura(), and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), and UpdateZone().

◆ VehicleSpellInitialize()

void Player::VehicleSpellInitialize ( )
9525{
9526 Creature* vehicle = GetVehicleCreatureBase();
9527 if (!vehicle)
9528 return;
9529
9530 uint8 cooldownCount = vehicle->m_CreatureSpellCooldowns.size();
9531
9532 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4));
9533 data << vehicle->GetGUID(); // Guid
9534 data << uint16(0); // Pet Family (0 for all vehicles)
9535 data << uint32(vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0); // Duration
9536 // The following three segments are read by the client as one uint32
9537 data << uint8(vehicle->GetReactState()); // React State
9538 data << uint8(0); // Command State
9539 data << uint16(0x800); // DisableActions (set for all vehicles)
9540
9541 for (uint32 i = 0; i < MAX_CREATURE_SPELLS; ++i)
9542 {
9543 uint32 spellId = vehicle->m_spells[i];
9544 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9545 if (!spellInfo)
9546 {
9547 data << uint16(0) << uint8(0) << uint8(i + 8);
9548 continue;
9549 }
9550
9551 ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(vehicle->GetEntry(), spellId);
9552 if (!sConditionMgr->IsObjectMeetToConditions(this, vehicle, conditions))
9553 {
9554 LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry {} spell {}", vehicle->ToCreature()->GetEntry(), spellId);
9555 data << uint16(0) << uint8(0) << uint8(i + 8);
9556 continue;
9557 }
9558
9559 if (spellInfo->IsPassive())
9560 vehicle->CastSpell(vehicle, spellId, true);
9561
9562 data << uint32(MAKE_UNIT_ACTION_BUTTON(spellId, i + 8));
9563 }
9564
9566 data << uint32(0);
9567
9568 data << uint8(0); // Auras?
9569
9570 // Cooldowns
9571 data << uint8(cooldownCount);
9572
9573 uint32 curTime = GameTime::GetGameTimeMS().count();
9575
9576 for (CreatureSpellCooldowns::const_iterator itr = vehicle->m_CreatureSpellCooldowns.begin(); itr != vehicle->m_CreatureSpellCooldowns.end(); ++itr)
9577 {
9578 uint16 category = itr->second.category;
9579 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9580
9581 data << uint32(itr->first); // spellid
9582 data << uint16(itr->second.category); // spell category
9583
9584 // send infinity cooldown in special format
9585 if (itr->second.end >= infTime)
9586 {
9587 data << uint32(1); // cooldown
9588 data << uint32(0x80000000); // category cooldown
9589 continue;
9590 }
9591
9592 data << uint32(category ? 0 : cooldown); // cooldown
9593 data << uint32(category ? cooldown : 0); // category cooldown
9594 }
9595
9596 GetSession()->SendPacket(&data);
9597}
static constexpr uint32 MAX_CREATURE_SPELLS
Definition: Unit.h:45
#define MAX_SPELL_CONTROL_BAR
Definition: CharmInfo.h:26
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition: Creature.h:251
uint32 GetTimer()
Definition: TemporarySummon.h:57
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:18664
TempSummon * ToTempSummon()
Definition: Unit.h:1743
bool IsSummon() const
Definition: Unit.h:751

References Unit::CastSpell(), Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), Creature::GetReactState(), GetSession(), TempSummon::GetTimer(), Unit::GetVehicleCreatureBase(), infinityCooldownDelayCheck, SpellInfo::IsPassive(), Unit::IsSummon(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Creature::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_CREATURE_SPELLS, MAX_SPELL_CONTROL_BAR, sConditionMgr, WorldSession::SendPacket(), SMSG_PET_SPELLS, sSpellMgr, Object::ToCreature(), and Unit::ToTempSummon().

Referenced by Unit::SetCharmedBy().

◆ VisualizeItem()

void Player::VisualizeItem ( uint8  slot,
Item pItem 
)
2891{
2892 if (!pItem)
2893 return;
2894
2895 // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory)
2897 pItem->SetBinding(true);
2898
2899 LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry());
2900
2901 m_items[slot] = pItem;
2902 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2905 pItem->SetSlot(slot);
2906 pItem->SetContainer(nullptr);
2907
2908 if (slot < EQUIPMENT_SLOT_END)
2909 SetVisibleItemSlot(slot, pItem);
2910
2911 pItem->SetState(ITEM_CHANGED, this);
2912}

References BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, EQUIPMENT_SLOT_END, Object::GetEntry(), Object::GetGUID(), Item::GetTemplate(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, Item::SetBinding(), Item::SetContainer(), Object::SetGuidValue(), Item::SetSlot(), Item::SetState(), and SetVisibleItemSlot().

Referenced by EquipItem(), and QuickEquipItem().

◆ Whisper() [1/2]

void Player::Whisper ( std::string_view  text,
Language  language,
Player receiver,
bool  = false 
)
overridevirtual

Handles whispers from Addons and players based on sender, receiver's guid and language.

Reimplemented from Unit.

9358{
9359 ASSERT(target);
9360
9361 bool isAddonMessage = language == LANG_ADDON;
9362
9363 if (!isAddonMessage) // if not addon data
9364 language = LANG_UNIVERSAL; // whispers should always be readable
9365
9366 std::string _text(text);
9367
9368 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_WHISPER, language, _text, target))
9369 {
9370 return;
9371 }
9372
9373 sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
9374
9375 WorldPacket data;
9376 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text);
9377 target->GetSession()->SendPacket(&data);
9378
9379 // rest stuff shouldn't happen in case of addon message
9380 if (isAddonMessage)
9381 return;
9382
9383 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
9384 GetSession()->SendPacket(&data);
9385
9386 if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
9387 {
9388 SetAcceptWhispers(true);
9390 }
9391
9392 // announce afk or dnd message
9393 if (target->isAFK())
9394 {
9395 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName(), target->autoReplyMsg);
9396 }
9397 else if (target->isDND())
9398 {
9399 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName(), target->autoReplyMsg);
9400 }
9401}
@ LANG_PLAYER_DND
Definition: Language.h:672
@ LANG_PLAYER_AFK
Definition: Language.h:673
@ LANG_COMMAND_WHISPERON
Definition: Language.h:330
@ CHAT_MSG_WHISPER_INFORM
Definition: SharedDefines.h:3161
@ CHAT_MSG_WHISPER
Definition: SharedDefines.h:3159
Language
Definition: SharedDefines.h:734
@ LANG_ADDON
Definition: SharedDefines.h:753
bool isAcceptWhispers() const
Definition: Player.h:1155

References ASSERT, autoReplyMsg, ChatHandler::BuildChatPacket(), CHAT_MSG_WHISPER, CHAT_MSG_WHISPER_INFORM, WorldObject::GetName(), GetSession(), isAcceptWhispers(), isAFK(), isDND(), IsGameMaster(), LANG_ADDON, LANG_COMMAND_WHISPERON, LANG_PLAYER_AFK, LANG_PLAYER_DND, LANG_UNIVERSAL, ChatHandler::PSendSysMessage(), WorldSession::SendPacket(), ChatHandler::SendSysMessage(), SetAcceptWhispers(), and sScriptMgr.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Whisper() [2/2]

void Player::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
overridevirtual

Reimplemented from Unit.

9404{
9405 if (!target)
9406 return;
9407
9408 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
9409 if (!bct)
9410 {
9411 LOG_ERROR("entities.unit", "Player::Whisper: `broadcast_text` was not {} found", textId);
9412 return;
9413 }
9414
9416 WorldPacket data;
9417 if (isBossWhisper)
9418 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9419 else
9420 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9421 target->SendDirectMessage(&data);
9422}
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:457

References ChatHandler::BuildChatPacket(), CHAT_MSG_RAID_BOSS_WHISPER, CHAT_MSG_WHISPER, Unit::getGender(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Player::Yell ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles yelled message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9315{
9316 std::string _text(text);
9317
9318 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_YELL, language, _text))
9319 {
9320 return;
9321 }
9322
9323 sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
9324
9325 WorldPacket data;
9326 ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
9327 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true, false, false, true);
9328}
@ CONFIG_LISTEN_RANGE_YELL
Definition: IWorld.h:201
@ CHAT_MSG_YELL
Definition: SharedDefines.h:3158

References ChatHandler::BuildChatPacket(), CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Yell() [2/2]

void Player::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9331{
9332 Talk(textId, CHAT_MSG_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
9333}

References CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Friends And Related Function Documentation

◆ CinematicMgr

friend class CinematicMgr
friend

Referenced by Player().

◆ Item::AddToUpdateQueueOf

void Item::AddToUpdateQueueOf ( Player player)
friend

◆ Item::RemoveFromUpdateQueueOf

void Item::RemoveFromUpdateQueueOf ( Player player)
friend

◆ WorldSession

friend class WorldSession
friend

Member Data Documentation

◆ _activeCheats

uint32 Player::_activeCheats
private

◆ _BgBattlegroundQueueID

◆ _cinematicMgr

CinematicMgr* Player::_cinematicMgr
private

◆ _corpseLocation

◆ _farSightDistance

Optional<float> Player::_farSightDistance = { }
private

◆ _innTriggerId

uint32 Player::_innTriggerId
protected

◆ _instanceResetTimes

◆ _pendingBindId

uint32 Player::_pendingBindId
private

◆ _pendingBindTimer

uint32 Player::_pendingBindTimer
private

Referenced by SetPendingBind(), and Update().

◆ _restBonus

float Player::_restBonus
protected

◆ _restFlagMask

uint32 Player::_restFlagMask
protected

◆ _restTime

time_t Player::_restTime
protected

◆ _wasOutdoor

bool Player::_wasOutdoor
private

◆ autoReplyMsg

std::string Player::autoReplyMsg

◆ bgZoneIdToFillWorldStates

std::unordered_map< int, bgZoneRef > Player::bgZoneIdToFillWorldStates = {}
static

Referenced by SendInitWorldStates().

◆ duel

◆ healthBeforeDuel

uint32 Player::healthBeforeDuel
private

◆ isDebugAreaTriggers

◆ ItemSetEff

std::vector<ItemSetEffect*> Player::ItemSetEff

◆ m_achievementMgr

◆ m_actionButtons

◆ m_activeSpec

◆ m_additionalSaveMask

uint8 Player::m_additionalSaveMask
protected

◆ m_additionalSaveTimer

uint16 Player::m_additionalSaveTimer
protected

◆ m_ammoDPS

float Player::m_ammoDPS
protected

◆ m_AreaID

uint32 Player::m_AreaID
protected

◆ m_areaUpdateId

uint32 Player::m_areaUpdateId
protected

◆ m_ArenaTeamIdInvited

uint32 Player::m_ArenaTeamIdInvited
protected

◆ m_ArmorProficiency

uint32 Player::m_ArmorProficiency
protected

◆ m_atLoginFlags

uint32 Player::m_atLoginFlags
protected

◆ m_auraBaseMod

◆ m_auraRaidUpdateMask

◆ m_baseFeralAP

uint32 Player::m_baseFeralAP
protected

◆ m_baseHealthRegen

uint32 Player::m_baseHealthRegen
protected

◆ m_baseManaRegen

uint32 Player::m_baseManaRegen
protected

◆ m_baseRatingValue

int32 Player::m_baseRatingValue[MAX_COMBAT_RATING]
protected

◆ m_baseSpellPower

uint32 Player::m_baseSpellPower
protected

◆ m_bgData

◆ m_bHasDelayedTeleport

bool Player::m_bHasDelayedTeleport
private

◆ m_bMustDelayTeleport

bool Player::m_bMustDelayTeleport
private

◆ m_bPassOnGroupLoot

bool Player::m_bPassOnGroupLoot
protected

◆ m_canBlock

bool Player::m_canBlock
protected

Referenced by CanBlock(), Player(), and SetCanBlock().

◆ m_canKnockback

bool Player::m_canKnockback
private

◆ m_canParry

bool Player::m_canParry
protected

Referenced by CanParry(), Player(), and SetCanParry().

◆ m_canTeleport

bool Player::m_canTeleport
private

Referenced by CanTeleport(), Player(), and SetCanTeleport().

◆ m_canTitanGrip

bool Player::m_canTitanGrip
protected

◆ m_ChampioningFaction

uint32 Player::m_ChampioningFaction
private

◆ m_channels

◆ m_charmAISpells

uint32 Player::m_charmAISpells[NUM_CAI_SPELLS]
protected

◆ m_charmUpdateTimer

uint32 Player::m_charmUpdateTimer

Referenced by Player(), and Update().

◆ m_charSettingsMap

◆ m_chatFloodData

std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> Player::m_chatFloodData
protected

Referenced by UpdateSpeakTime().

◆ m_cinematic

uint8 Player::m_cinematic
protected

◆ m_clientGUIDs

◆ m_contestedPvPTimer

uint32 Player::m_contestedPvPTimer
protected

◆ m_creationTime

Seconds Player::m_creationTime
private

◆ m_currentBuybackSlot

uint32 Player::m_currentBuybackSlot
protected

◆ m_DailyQuestChanged

bool Player::m_DailyQuestChanged
protected

◆ m_deathExpireTime

◆ m_deathTimer

◆ m_declinedname

DeclinedName* Player::m_declinedname
protected

◆ m_DelayedOperations

uint32 Player::m_DelayedOperations
private

◆ m_DFQuests

◆ m_divider

ObjectGuid Player::m_divider
protected

Referenced by GetDivider(), and SetDivider().

◆ m_drunkTimer

uint32 Player::m_drunkTimer
protected

◆ m_drwGUID

ObjectGuid Player::m_drwGUID

◆ m_dungeonDifficulty

Difficulty Player::m_dungeonDifficulty
protected

◆ m_enchantDuration

◆ m_entryPointData

◆ m_EquipmentSets

◆ m_extraBonusTalentCount

uint32 Player::m_extraBonusTalentCount
protected

◆ m_ExtraFlags

◆ m_flightSpellActivated

uint32 Player::m_flightSpellActivated
private

◆ m_foodEmoteTimerCount

uint32 Player::m_foodEmoteTimerCount
protected

Referenced by Player(), and RegenerateAll().

◆ m_forced_speed_changes

uint8 Player::m_forced_speed_changes[MAX_MOVE_TYPE]

◆ m_GlobalCooldownMgr

GlobalCooldownMgr Player::m_GlobalCooldownMgr
protected

Referenced by GetGlobalCooldownMgr().

◆ m_Glyphs

◆ m_grantableLevels

uint8 Player::m_grantableLevels
protected

◆ m_group

◆ m_groupInvite

Group* Player::m_groupInvite
protected

Referenced by GetGroupInvite(), and SetGroupInvite().

◆ m_groupUpdateMask

uint32 Player::m_groupUpdateMask
protected

◆ m_GuildIdInvited

uint32 Player::m_GuildIdInvited
protected

◆ m_homebindAreaId

uint16 Player::m_homebindAreaId

◆ m_homebindMapId

◆ m_HomebindTimer

uint32 Player::m_HomebindTimer

Referenced by Player(), and UpdateHomebindTime().

◆ m_homebindX

◆ m_homebindY

◆ m_homebindZ

◆ m_hostileReferenceCheckTimer

uint16 Player::m_hostileReferenceCheckTimer
protected

Referenced by Player(), and Update().

◆ m_ingametime

uint32 Player::m_ingametime
protected

◆ m_InstanceValid

◆ m_IsBGRandomWinner

bool Player::m_IsBGRandomWinner
protected

◆ m_isInSharedVisionOf

std::set<Unit*> Player::m_isInSharedVisionOf

◆ m_isInstantFlightOn

bool Player::m_isInstantFlightOn
private

◆ m_isInWater

bool Player::m_isInWater
private

Referenced by IsInWater(), Player(), and SetInWater().

◆ m_itemDuration

◆ m_items

◆ m_itemSoulboundTradeable

ItemDurationList Player::m_itemSoulboundTradeable
protected

◆ m_itemUpdateQueue

std::vector<Item*> Player::m_itemUpdateQueue
protected

◆ m_itemUpdateQueueBlocked

bool Player::m_itemUpdateQueueBlocked
protected

◆ m_Last_tick

time_t Player::m_Last_tick

Referenced by Create(), Player(), and Update().

◆ m_lastDailyQuestTime

time_t Player::m_lastDailyQuestTime
protected

◆ m_lastFallTime

uint32 Player::m_lastFallTime
private

◆ m_lastFallZ

float Player::m_lastFallZ
private

◆ m_lastHonorUpdateTime

time_t Player::m_lastHonorUpdateTime
protected

◆ m_lastpetnumber

uint32 Player::m_lastpetnumber
protected

◆ m_lastPotionId

uint32 Player::m_lastPotionId
protected

◆ m_logintime

time_t Player::m_logintime

Referenced by AddItemToBuyBackSlot(), and Player().

◆ m_lootGuid

ObjectGuid Player::m_lootGuid
protected

Referenced by GetLootGUID(), and SetLootGUID().

◆ m_mail

◆ m_mailsUpdated

◆ m_mapRef

MapReference Player::m_mapRef
private

Referenced by GetMapRef(), and SetMap().

◆ m_MirrorTimer

int32 Player::m_MirrorTimer[MAX_TIMERS]
private

◆ m_MirrorTimerFlags

uint8 Player::m_MirrorTimerFlags
private

◆ m_MirrorTimerFlagsLast

uint8 Player::m_MirrorTimerFlagsLast
private

◆ m_MonthlyQuestChanged

bool Player::m_MonthlyQuestChanged
protected

◆ m_monthlyquests

◆ m_MountBlockId

uint32 Player::m_MountBlockId
protected

◆ m_mover

◆ m_NeedToSaveGlyphs

bool Player::m_NeedToSaveGlyphs
protected

◆ m_needZoneUpdate

bool Player::m_needZoneUpdate
protected

◆ m_newVisible

std::vector<Unit*> Player::m_newVisible

◆ m_nextMailDelivereTime

time_t Player::m_nextMailDelivereTime

◆ m_nextSave

uint32 Player::m_nextSave
protected

◆ m_oldpetspell

uint32 Player::m_oldpetspell
private

◆ m_originalGroup

GroupReference Player::m_originalGroup
protected

◆ m_pendingSpectatorForBG

uint32 Player::m_pendingSpectatorForBG

◆ m_pendingSpectatorInviteInstanceId

uint32 Player::m_pendingSpectatorInviteInstanceId

◆ m_petStable

std::unique_ptr<PetStable> Player::m_petStable
private

◆ m_Played_time

◆ m_powerFraction

float Player::m_powerFraction[MAX_POWERS]
protected

Referenced by Player(), and Regenerate().

◆ m_questRewardTalentCount

uint32 Player::m_questRewardTalentCount
protected

◆ m_QuestStatus

◆ m_QuestStatusSave

◆ m_raidDifficulty

Difficulty Player::m_raidDifficulty
protected

◆ m_raidMapDifficulty

Difficulty Player::m_raidMapDifficulty
protected

◆ m_realDodge

float Player::m_realDodge
protected

◆ m_realParry

float Player::m_realParry
protected

◆ m_recallMap

uint32 Player::m_recallMap

Referenced by Player(), and SaveRecallPosition().

◆ m_recallO

float Player::m_recallO

Referenced by Player(), and SaveRecallPosition().

◆ m_recallX

float Player::m_recallX

Referenced by Player(), and SaveRecallPosition().

◆ m_recallY

float Player::m_recallY

Referenced by Player(), and SaveRecallPosition().

◆ m_recallZ

float Player::m_recallZ

Referenced by Player(), and SaveRecallPosition().

◆ m_receivedSpectatorResetFor

◆ m_refundableItems

RefundableItemsSet Player::m_refundableItems
private

◆ m_regenTimerCount

uint32 Player::m_regenTimerCount
protected

◆ m_reputationMgr

◆ m_resetTalentsCost

uint32 Player::m_resetTalentsCost
protected

◆ m_resetTalentsTime

time_t Player::m_resetTalentsTime
protected

◆ m_resurrectGUID

ObjectGuid Player::m_resurrectGUID
protected

◆ m_resurrectHealth

uint32 Player::m_resurrectHealth
protected

◆ m_resurrectMana

uint32 Player::m_resurrectMana
protected

◆ m_resurrectMap

uint32 Player::m_resurrectMap
protected

◆ m_resurrectX

float Player::m_resurrectX
protected

◆ m_resurrectY

float Player::m_resurrectY
protected

◆ m_resurrectZ

float Player::m_resurrectZ
protected

◆ m_RewardedQuests

◆ m_RewardedQuestsSave

QuestStatusSaveMap Player::m_RewardedQuestsSave
protected

◆ m_runes

◆ m_SeasonalQuestChanged

bool Player::m_SeasonalQuestChanged
protected

◆ m_seasonalquests

◆ m_seer

◆ m_session

◆ m_social

PlayerSocial* Player::m_social
protected

Referenced by GetSocial(), LoadFromDB(), and Player().

◆ m_soulboundTradableLock

std::mutex Player::m_soulboundTradableLock
protected

◆ m_specsCount

◆ m_spellCooldowns

◆ m_spellMods

◆ m_spellModTakingSpell

◆ m_spellPenetrationItemMod

int32 Player::m_spellPenetrationItemMod
protected

◆ m_spells

◆ m_summon_asSpectator

bool Player::m_summon_asSpectator
protected

◆ m_summon_expire

time_t Player::m_summon_expire
protected

◆ m_summon_mapid

uint32 Player::m_summon_mapid
protected

◆ m_summon_x

float Player::m_summon_x
protected

◆ m_summon_y

float Player::m_summon_y
protected

◆ m_summon_z

float Player::m_summon_z
protected

◆ m_swingErrorMsg

uint8 Player::m_swingErrorMsg
protected

Referenced by Player(), and Update().

◆ m_talents

◆ m_taxi

◆ m_team

TeamId Player::m_team
protected

◆ m_temporaryUnsummonedPetNumber

◆ m_timedquests

QuestSet Player::m_timedquests
protected

◆ m_trade

◆ m_usedTalentCount

uint32 Player::m_usedTalentCount
protected

◆ m_weaponChangeTimer

uint32 Player::m_weaponChangeTimer
protected

◆ m_WeaponProficiency

uint32 Player::m_WeaponProficiency
protected

◆ m_WeeklyQuestChanged

bool Player::m_WeeklyQuestChanged
protected

◆ m_weeklyquests

◆ m_zoneUpdateId

uint32 Player::m_zoneUpdateId
protected

◆ m_zoneUpdateTimer

uint32 Player::m_zoneUpdateTimer
protected

Referenced by Player(), Update(), and UpdateZone().

◆ manaBeforeDuel

uint32 Player::manaBeforeDuel
private

◆ mMitems

ItemMap Player::mMitems

◆ mSemaphoreTeleport_Far

time_t Player::mSemaphoreTeleport_Far
private

◆ mSemaphoreTeleport_Near

time_t Player::mSemaphoreTeleport_Near
private

◆ mSkillStatus

◆ PlayerTalkClass

PlayerMenu* Player::PlayerTalkClass

Referenced by AddGossipItemFor(), ClearGossipMenuFor(), CloseGossipMenuFor(), Spell::EffectQuestStart(), go_wind_stone::go_wind_stoneAI::GossipSelect(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverCancel(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), WorldSession::HandleQuestQueryOpcode(), npc_wg_quest_giver::OnGossipHello(), npc_elder_clearwater::OnGossipHello(), npc_experience::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_cos_chromie_middle::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), OnGossipSelect(), Player(), PrepareGossipMenu(), PrepareQuestMenu(), WorldSession::SendBindPoint(), SendGossipMenuFor(), SendPreparedGossip(), SendPreparedQuest(), npc_costumed_orphan_matron::sGossipHello(), npc_pet_trainer::npc_pet_trainerAI::sGossipSelect(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_echo_of_medivh::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_sergeant_bly::npc_sergeant_blyAI::sGossipSelect(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), and ~Player().

◆ pvpInfo

◆ teleportStore_dest

WorldLocation Player::teleportStore_dest
private

Referenced by GetTeleportDest(), TeleportTo(), and Update().

◆ teleportStore_options

uint32 Player::teleportStore_options
private

Referenced by Player(), TeleportTo(), and Update().

◆ unReadMails

◆ WhisperList